2017-08-02 42 views
0

我是OOP的新手,似乎陷入了一些我很確定很簡單的事情,但我不明白髮生了什麼。爲什麼這個PHP對象將項目附加到自身上?

下面的示例代碼:

class add_some { 

    static $arr = array('a', 'b'); 

    static $new_arr = array(); 

    public static function iterate() { 

     foreach (self::$arr as $v) { 
      self::$new_arr[] = $v; 
     } 

    } 

} 

for ($i=0; $i < 3; $i++) { 

    // instantiate the object 
    $add_some = new add_some; 

    // launch the method that copies items from $arr to $new_arr 
    $add_some::iterate(); 

    echo '<pre>'; 
    print_r($add_some::$new_arr); 
    echo "</pre>"; 

    unset($add_some); 

} 

經過一個循環,並增加其在該項目$ ARR$ new_arr,它基本上覆制從$所有項目ARR至$ new_arr

代碼實例化一個新對象並執行iterate()方法,該方法將項目從$ arr複製到$ new_arr 3次。

每次迭代都會創建一個新對象$ add_some = new add_some;所以每次迭代應該只是生產

Array 
(
    [0] => a 
    [1] => b 
Array 
(
    [0] => a 
    [1] => b 
) 
Array 
(
    [0] => a 
    [1] => b 
) 

但由於某些原因的對象保持在每次迭代增長....我不知道爲什麼 ..我試圖銷燬對象(未設置)和不知道我是否應該做其他事情。

Array 
(
    [0] => a 
    [1] => b 
) 
Array 
(
    [0] => a 
    [1] => b 
    [2] => a 
    [3] => b 
) 
Array 
(
    [0] => a 
    [1] => b 
    [2] => a 
    [3] => b 
    [4] => a 
    [5] => b 
) 
+0

+1到一定程度上抵消了downvotes,問題是沒有那麼糟它不配他們。這個問題已經清楚地說明過了,對於OOP的新手來說,這個問題並不是不合理的。 – Oleg

+0

謝謝,我對downvotes有點困惑,我在OOP上做了2門課程,雖然他們是初學者課程,但是即使在對象被銷燬之後,也沒有提到在內存中維護的靜態屬性。這個問題可能對其他新手有幫助。 –

回答

4

要調用通過使用::(Paamayim Nekudotayim)的靜態方法,你應該使用->,而不是使用靜態函數。

靜態的意思是說,全局保持這個狀態,每次調用新的時候都沒有實例化,它是static

例如,你可以調用像這樣一個靜態方法:

class MyClass { 
    static function MyFunc() { echo 'Stuff'; } 
} 

MyClass::MyFunc() 

沒有必要(也不應該知道)創建的MyClass實例調用靜態MyFunc

每次調用iterate它附加全局靜態數組$arr

做正確的方法時,這將被

class add_some { 
    private $x = 1; 
    private $arr = array('a', 'b'); 
    public $new_arr = array(); 

    public function iterate() { 
    foreach ($this->arr as $v) { 
     $this->new_arr[] = $v; 
    } 
    } 
} 

for ($i=0; $i < 3; $i++) { 
    $add_some = new add_some(); 
    $add_some->iterate(); 
    print_r($add_some->new_arr); 
} 
+0

啊!謝謝! –

+1

PHP開發人員將::稱爲Paamayim Nekudotayim是否很常見?如果是這種情況,這真的很奇怪。這是瘋狂的PHP開發團隊沒有打擾通過四個主要版本解決它。 – Oleg

+0

有什麼可解決的? Paamayim Nekudotayim在希伯來文中意味着雙冒號... http://php.net/manual/en/language.oop5.paamayim-nekudotayim.php – Geoffrey

相關問題