2014-09-24 3 views
2

내 클래스에 __construct 함수를 빌드하려고합니다. 이 함수는 All $ _REQUEST 값을 가져 와서 나중에 id로 호출 할 수 있도록 배열에 저장해야합니다. 문제는 그것이 내 변수를 저장하지 않고 그 이유를 모른다는 것입니다.__construct 함수가 예상대로 작동하지 않습니다.

이것은 내 첫 번째 "심각한"시도로서, 가장 어쩌면 내 어리 석음입니다. 하지만 그게 뭔지 알고 싶습니다.

Class Regex { 

private static $requests = array(); 

    function __construct() { 
     foreach($_REQUEST as $key => $value) { 
      self::$requests[$key] = array(
       'value' => $value, 
       'status' => false, 
       'errorList' => array() 
      ); 
     } 
    } 



    public static function preg($key, $rules) { 
     var_dump(self::$requests); // for test purpose 
    } 
} 

위의 결과는 array (size=0) empty입니다.

+1

가 실제로 생성자를 초기화하는 있습니까? – andyroo

+0

생성자가 호출되도록하려면 Regex()를 새로 호출해야합니다. –

+1

이 클래스를 수동으로 초기화 클래스로 만들면 왜이 정적이 발생합니까? –

답변

3

:

$regex = new Regex; 

하지만 Regex 객체를 생성하지 않으므로 생성자는 호출되지 않으므로 빈 $ requests 배열이됩니다. 당신이 울부 짖는 볼 수 bwoebi 대답 것에 따라 확장

2

정적 기능으로 작업하십시오. 나는 당신이 생성 방법을 호출하지 않는다고 생각합니다. 새 인스턴스를 만들면 __construct 함수가 호출됩니다.

$regex = new Regex; 

당신이 예를 Regex::preg 생성자의 정적 클래스를 호출 할 경우

가 호출되지 않습니다.

+0

안녕 당신은 맞습니다. 그리고 정적 인 클래스를 유지하기 위해 같은 파일에서 클래스를 초기화합니다. 이 방법은 매번 여분의 줄을 던질 필요없이 정적이라고 계속 호출 할 수 있습니다 :) – Matt

4

생성자를 호출하고 있습니까? 생성자는 명시 적으로 또는 new 키워드를 통해 호출 할 때만 호출됩니다.

PHP에는 Java와 같은 정적 생성자가 없습니다.

당신은 배열이 preg() 방법에 처음 액세스에 작성되어 있는지 확인해야합니다 :

당신의 정규식 클래스의 생성자는 지금과 같은 새로운 정규 표현식 객체 생성시이라고
public static function preg($key, $rules) { 
    if (empty(self::$requests)) { 
     foreach($_REQUEST as $key => $value) { 
      self::$requests[$key] = array(
       'value' => $value, 
       'status' => false, 
       'errorList' => array() 
      ); 
     } 
    } 
    var_dump(self::$requests); // for test purpose 
} 
+0

흠 ... 나는'if (empty())'..라고 생각합니다. 그렇지 않으면'self :: $ request' 빈 배열로 초기화되면,이'if (! empty())'는 true를 반환하지 않습니다; 그러므로 결코 채워지지 않을 것입니다 –

+1

@ FélixGagnon-Grenier 초기에는'! self :: $ requests'을 가지고 있었고'empty()'를 추가 할 때'!'를 제거하는 것을 잊었습니다. 감사합니다 :-) – bwoebi

-1

, 당신은 여전히 ​​생성자 자체에서 정적 기능 레그에 대한 호출을 추가하여 의도 한 결과를 간단하게 얻을 수 있습니다 : 이것은 단지 더를 추가했다

어떤 실질적인 이익도없이 부풀어 오른다.

이것은 특정 경우에 유용 할 수 있지만 현재 구조가 두 개의 간단한 행을 추가하는 것만으로도 작동 할 수 있다는 것을 보여주기 위해이 대답에 추가했습니다. @ bwoebi의 답변으로가는 것이 좋습니다. 하지만 컨트롤러가 정적이 아니기 때문에 컨트롤러가 고정 된 방법으로 통신하는 것을 막지는 않습니다.

PHP :

class Regex { 

    private static $requests = array(); 

    function __construct(){ 
     if (empty(self::$requests)) { 
      foreach($_REQUEST as $key => $value) { 
       self::$requests[$key] = array(
        'value' => $value, 
        'status' => false, 
        'errorList' => array() 
       ); 
      } 
     } 
     self::preg(); 
    } 

    public static function preg(){ 
     var_dump(self::$requests); // for test purpose 
    } 
} 

$var = new Regex(); 
+0

왜 게시합니까? –

+0

이 사이트는 분명한 답변을 제공하는 것이 아니라 그러한 것들이 어떻게 작동하는지에 대한 답변을 요청하는 사람들을 교육시키는 것에 관한 것입니다. 원본과 비교하여 좋은 구현은 아니지만 컨트롤러 작동 방식에 대한 통찰력을 제공합니다. 필자는이 솔루션이 효과가있을 것이라는 점에서 상대적으로 명확하다고 생각합니다.이 경우에는 최상의 옵션이 아닐 것입니다. 그러나 그는 미래에 유용하게 사용될 수 있기 때문에 여전히 그것을 알고 있어야합니다. –

+0

답변에 다음을 분명하게 기입하십시오. 기존 답변에 무언가를 추가하고 붙여 넣기 콘텐츠를 크게 복사한다고 말하면서 이것이 가장 좋은 옵션이 아닌 이유를 설명하는 것은 물론 가장 좋은 옵션은 아닙니다. 선택권. –

관련 문제