PHP對象賦值給變數的兩種方式的區別,一般賦值和引用賦值?

class Person {

public $name;

protected $age;

public function __construct($name, $age) {

$this-&>name = $name;

$this-&>age = $age;

}

}

$lh = new Person(劉慧, 23);

$a = $lh;

$b = $lh;

-------------------------------------------------------------------------

請問$a 和 $b的區別?可以從內存堆棧的角度的分析。

··


PHP里不需要加引用符號。所有對象都是引用傳遞,除非顯式調用clone $object


基本類型的變數賦值,通常是真正的複製(理解為:2個指針,指向2塊內存空間)。

$a = 100;
$b = $a;
unset($a);
echo $b."
";

普通的對象賦值,都是引用,也就是:

2個指針,指向同1塊內存空間。

如果使用clone去賦值對象,就不是引用賦值了,也就是:

2個指針,指向2塊內存空間。

第二種情況,還可以延伸到「淺複製」和「深複製」的問題,因為一個實例的對象自身,可能又含有另一個對象實例成員。


瀉藥

===============

我忘了是從哪個版本開始,PHP里不需要加引用符號了。

加了會報一個語法錯誤,這個詳細的解答呢,可以去問 @韓天峰 (他也回答了呢)。

亦或問問 @Laruence鳥叔這位大拿。

就醬


有一些區別,在你的例子中,如果你給b賦值一個新的值,lh的指向也會跟著改變,但是a不會有這個問題。

PHP手冊中對引用的說法是:

Note:

$a and $b are completely equal here. $a is not pointing to $b or vice versa. $a and $b are pointing to the same place.

對PHP5中對象和引用的說法是:

A PHP reference is an alias, which allows two different variables to write to the same value. As of PHP 5, an object variable doesnt contain the object itself as value anymore. It only contains an object identifier which allows object accessors to find the actual object. When an object is sent by argument, returned or assigned to another variable, the different variables are not aliases: they hold a copy of the identifier, which points to the same object.

其實對對象變數取更像是一個指向「指針」的指針。


我也記得PHP里不需要加引用符號,都是引用傳遞。但是經過我的測試(PHP5.6.7),我對以下內容存在疑惑:

class Person {
public $name = myName;
}

$obj = new Person;
$assign = $obj;
$reference = $obj;

$obj = null;//此操作很重要
var_dump($obj);//得到null
var_dump($assign);//得到object(Person)#1 (1) {["name"]=&>string(6) "myName"}
var_dump($reference);//得到null

請問何原因?


完全一樣


推薦閱讀:

如何評價2017年6月10日-11日 DevLink.cn 在北京舉辦的第三屆PHP全球開發者大會?
有人說,熟練掌握了 if 和 while,就等於掌握了 PHP 語言,這句話有道理嗎?為什麼?
為什麼在代碼中不應該混雜sql語句?
如何成為php核心開發組成員?
php單點登錄如何實現

TAG:PHP | PHP開發 | PHP學習 |