2011-05-31 169 views
2

我很習慣於PHP5,但必須編寫一個PHP4同步腳本,現在我正在做一些挖掘以找到PHP5和4之間的差異。問題是我得到了很多矛盾,有些網站告訴我PHP4有沒有按地址和任何人告訴我,這個問題只發生使用的foreach時..參考PHP4參數?

要澄清一個例子:

function doSomething() 
{ 
    $aMyAr = array(); 
    $oUser = new User(); 

    addUser($aMyAr, $oUser); 
} 

function addUser($aDestArray, $oUser) 
{ 
    $aMyAr[] = $oUser; 
} 

我知道你會思考你爲什麼不只是運行此腳本自己和回聲/ print_r的輸出?那麼由於某些原因,PHP4將不會運行在最新的WAMP/XAMPP(是的,我嘗試了一個被稱爲兼容的Apache版本的垃圾負載...)

回答

3

只有這樣的改變,在PHP4中,對象被複制默認情況下,在PHP5中,它們被視爲默認引用。即:

$a = new stdClass(); 
$a->prop = "original"; 
$b = $a; 

$b->prop = "changed"; 
echo $a->prop; 

# PHP4 outputs "original" because $a and $b are different objects 
# PHP5 outputs "changed" because $a and $b are the same object 

當你進行函數調用或使用foreach時,在PHP4中,對象被複制而不是被引用傳遞。

爲了使PHP4函數的參數像PHP5,你只需要明確pass function arguments by reference,即:

function someFunc(& $someObject) { 
    $someObject->prop = "changed"; 
} 

someFunc($a); 
echo $a->prop; # prints "changed" 

所以,PHP4面向對象的代碼風了&散落各地的地方(寫入真正面向對象的代碼回來的時候,這非常令人討厭!)。

另一個例子是按引用分配。 $b =& $a用PHP4中的對象做什麼簡單的$b = $a在PHP5中做什麼。

最後,通過引用返回。如果你在一個函數內部創建一個對象並且想返回它(而不是返回它的一個副本),你必須用&定義函數,即function &someFunc() {}

再次,PHP docs解釋語法。到目前爲止做的最好的事情就是不要使用PHP4!

+0

謝謝,那就是我一直在尋找:) – Rob 2011-05-31 21:08:27

+0

很酷,我已經有一個編輯框打開,並附帶一些額外的信息,以防萬一。編寫和特別調試PHP4 OO代碼如果習慣於PHP5,那麼它會非常快速地變得非常煩人(當時它很煩人)。經過這麼多年的「正常」物體之後,我會很難再回來。 – joelhardi 2011-05-31 21:24:43

+0

是的,我很樂意使用PHP5.3,客戶無法升級,因爲他有很多webapps在運行,升級會花費很多精力爲這個小型項目做。 幸運的是,這只是一個有10個班級的項目,所以沒有那麼多的可怕的錯誤。我只是沒有使用修飾符,__construct,foreach,接口和擴展。應該安全嗎? – Rob 2011-05-31 21:33:59