2014-09-24 103 views
2

我想爲我的類建立一個__construct函數。這個函數應該獲得所有$ _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 2014-09-24 12:41:34

+0

您需要調用新的Regex()才能調用構造函數 – 2014-09-24 12:43:02

+1

爲什麼這是靜態的,如果您只是手動將此類設爲初始化類? – 2014-09-24 12:52:47

回答

3

您正則表達式類的構造函數是在創建一個新的正則表達式的物體,像所謂:

$regex = new Regex; 

但你永遠不會創建一個Regex對象,所以構造函數永遠不會被調用,導致一個空的$ requests數組。

2

您使用靜態函數。我想你不要調用構造方法。如果您創建新實例,則會調用__construct函數。

$regex = new Regex; 

如果您調用靜態類,例如Regex::preg,則不會調用構造函數。

+0

嗨,你是對的。爲了讓我的類保持靜態,我在同一個文件中初始化類。這樣,我可以繼續把它叫做靜態的,而不必每次都在那裏多加一條線:) – Matt 2014-09-24 12:47:02

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

hmm ...我想你的意思是'if(empty())'..否則,因爲'self :: $ request'被初始化爲一個空數組,這個'if(!empty())'永遠不會返回true;因此它永遠不會被填充 – 2014-09-24 12:51:06

+1

@FélixGagnon-Grenier最初有'!self :: $ requests',並且在添加'empty()'時忘記刪除'!'。感謝:-) – bwoebi 2014-09-24 12:51:58

-1

擴大在什麼bwoebi已經回答了,你仍然可以得到預期的結果只需從構造函數本身將調用靜態函數預浸料,你可以波紋管看到:

也就是說,這只是增加更多膨脹沒有任何實際的好處。

雖然這可能進來在某些情況下是有用的,我只加了它這個答案的平均中,以顯示你當前的結構可以通過簡單地增加兩行簡單的工作,我會建議使用@ 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

爲什麼發佈呢? – 2014-09-24 13:07:26

+0

因爲本網站不只是提供明確的答案,而且還關於教育那些詢問這些問題的答案的人。 雖然這不是一個很好的實施相比,它提供了一些有關如何控制器工作的見解。 我認爲我相對清楚地表明這種解決方案可行,在這種情況下它不是最好的選擇。但是,他仍然應該意識到這一點,因爲它可能在未來有用。 – 2014-09-24 13:10:56

+0

請在你的回答中明確說明:)你只是說你給現有的答案添加了一些東西,大大地複製了粘貼的內容,甚至沒有提到這不是最好的選擇,更不用說解釋爲什麼這不是最大的選項。 – 2014-09-24 13:29:56