PHP 對象詳解

1.應用場景

瞭解PHP對象的用法. 合理使用其進行開發.

2.學習/操作

1. PHP對象到底是值傳遞還是引用傳遞

 

手冊:

在php5 的對象編程經常提到的一個關鍵點是“默認情況下對象是通過引用傳遞的”。但其實這不是完全正確的。

下面通過一些例子來說明。

PHP 的引用是別名,就是兩個不同的變量名字指向相同的內容

在 PHP 5,一個對象變量已經不再保存整個對象的值。只是保存一個標識符來訪問真正的對象內容。

當對象作爲參數傳遞,作爲結果返回,

或者賦值給另外一個變量,另外一個變量跟原來的不是引用的關係,只是他們都保存着同一個標識符的拷貝,這個標識符指向同一個對象的真正內容。

 

手冊上例子:

這裏省略.

 

代碼執行情況:

class A{

}
$a=new A;
$b=$a;
$a->name='haha';
echo '<pre>';
var_dump($b);
var_dump($a);
echo '<hr/>';
function test($obj){
    $obj->name='xixi';
}
test($a);
var_dump($b);
var_dump($a);
echo '<hr/>';
$a=100;
var_dump($a);
var_dump($b);

 

網友一:

對象在函數中是引用傳遞

即使賦值給其它變量,也是引用

但是改變了$a的類型,準確的說是zval.value指針都變化了,所以此時產生了分裂。

 

所以:

儘量避免函數內操作外部對象,否則有可能造成致命性的邏輯錯誤,特別是改變對象數據的時候。
或者在做對象數據傳遞的時候要注意數據的嚴謹性。

 

網友二:

$a和$b是同一個標示符的拷貝,都是指向同一個對象A,所以你改變$a或者$b的屬性, 其實也就是改變的同一個對象A的屬性,

但是$a和$b是兩個不同的變量,他們兩個不是引用關係。


$a=100, 這裏$a已經是變成整數類型,不再指向對象A了,$b還是指向的對象A。
$b = &$a;你改成這樣,$a和$b就是引用關係,後面$b也會輸出爲100。

 

網友三:

其實$a$b都是指向的是對象的標識符,也就是你輸出時看到的#1,而這個標識符纔是指向的對象。

而當你設置了$b=100時,此時改變了$b的指向,但是並不會影響$a的指向。

 

關鍵點:

造成這種疑問的,都是把引用當成指針去理解了.

 

 

 

個人建議:

不要輕易去操作對象, 如果可以使用數組去代替.

 

 

 

後續補充

...

3.問題/補充

TBD

4.參考

https://www.php.net/manual/zh/language.oop5.references.php

https://segmentfault.com/q/1010000010641993?_ea=2363326  //PHP對象到底是值傳遞還是引用傳遞

https://www.cnblogs.com/aademeng/articles/9194688.html   //PHP中對象是按值傳遞還是按引用傳遞?

後續補充

...

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章