摘要:相反,使用了另一種方式將指向同一個對象,稱其為引用。如果對象是完全相同的,但存儲在不同的位置,將返回。對象總是通過引用傳遞。流暢的接口對象總是通過引用傳遞,這表明無需從一個方法中返回一個對象來觀察它的變化。
很多數(shù)據(jù)類型都可以寫時復(fù)制(copy-on-write),如$a=$b,兩個變量賦予的值相等。
對于對象就不一樣:
$box1 = new Parcel(); $box1->destinationCountry = "Denmark"; $box2 = $box1; $box2->destinationCountry = "Brazil"; echo "Parcels need to ship to:" . $box1->destinationCountry . " and " . $box2->destinationCountry; //打印結(jié)果 //Parcels need to ship to: Brazil and Brazil
現(xiàn)在的情況是,當將$box1賦值給$box2時,并沒有復(fù)制$box1的值。相反,PHP使用了另一種方式將$box2指向同一個對象,稱其為引用(reference)。
通過使用==操作符來比較兩個對象,可以知道它們是否具有相同的類和屬性。
if($box1 == $box2) echo "equivalent";
還可以更進一步區(qū)分它們是否引用同一個原始對象,可用同樣的方式===操作符進行比較:
if($box1 === $box2) echo "exact same object!";
當兩個變量指向相同的值時,===比較操作符才會返回true。如果對象是完全相同的,但存儲在不同的位置,將返回false。
對象總是通過引用傳遞。即當傳遞一個對象到一個函數(shù)中,這個函數(shù)會作用于相同的對象,如果這個對象在函數(shù)內(nèi)部發(fā)生變化,這種變化會反映到函數(shù)外部。這是將一個對象賦值給一個新變量的行為延伸。
對象總是以這樣的方式表現(xiàn),即它們提供一個對原始對象的引用,而不是創(chuàng)建自己的一個副本。
$courier = new PigeonPost("Avian Delivery Ltd"); $other_courier = $courier; $other_courier->name = "Pigeon Post"; echo $courier->name; // outputs "Pigeon Post"
對象會提供一個指向自己的引用,而不是復(fù)制自己的一個副本。這意味著如果一個函數(shù)對傳入的一個對象進行操作時,沒有必要從函數(shù)中返回。這種變化會在對象的原始副本上反映出來。
如果需要為一個已經(jīng)存在的對象復(fù)制一個多帶帶的副本,可以使用clone這個關(guān)鍵字來創(chuàng)建。
$courier = new PigeonPost("Avian Delivery Ltd"); $other_courier = clone $courier; $other_courier->name = "Pigeon Post"; echo $courier->name; // outputs "Avian Delivery Ltd"
當復(fù)制一個對象時,存儲在其屬性中的任何對象都將是引用而不是副本。
PHP有一個神奇的方法,即如果聲明了一個對象,當復(fù)制這個對象時,會調(diào)用這個對象,這就是_clone()方法,你可以聲明而且以此來決定當復(fù)制對象時會做什么,甚至不接受復(fù)制。
流暢的接口
對象總是通過引用傳遞,這表明無需從一個方法中返回一個對象來觀察它的變化。然而,如果從一個方法中返回$this,可以在應(yīng)用程序內(nèi)建立一個流暢的接口(fluent interface),可讓你將方法鏈接在一起。其工作原理如下:
1.創(chuàng)建對象
2.調(diào)用對象的方法
3.得到從方法中返回的修正對象
4.選擇返回步驟2
class Parcel { protected $weight; protected $destinationCountry; public function setWeight($weight) { echo "weight set to: " . $weight . " "; $this->weight = $weight; return $this; } public function setCountry($country) { echo "destination country is: " . $country . " "; $this->destinationCountry = $country; return $this; } } $myParcel = new Parcel; $myParcel->setWeight(5)->setCountry("Peru");
這里的關(guān)鍵是可以在一行代碼中調(diào)用多個方法(可以加一些換行符以增加代碼的可讀性),并可按任意順序調(diào)用。由于每個方法都返回生成的對象,因此可以通過返回對象再調(diào)用下一個方法。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/28418.html
摘要:即產(chǎn)生了相當于這樣的效果,所以改變的值也同時改變了的值。不要用返回引用來增加性能,引擎足夠聰明來自己進行優(yōu)化。只能從函數(shù)返回引用變量沒別的方法。 關(guān)鍵是對global的誤解,之前以為在函數(shù)中g(shù)lobal變量,就是把函數(shù)外部的變量拿進函數(shù)內(nèi)部使用,但似乎我錯了引用傳遞+unset+global理解 php的引用(就是在變量、函數(shù)、對象等前面加上&符號)在PHP中引用的意思是:不同的名字訪...
摘要:在中使用對象的時候,我們總是被告知默認情況下對象是按照引用傳遞的,其實這是個誤區(qū),不完全正確。我們從下面的示例來分析此時的關(guān)系此時的關(guān)系如果對象是按照引用傳遞的,那么輸出的內(nèi)容應(yīng)該一樣,事實上結(jié)果并非如此。 在PHP中使用對象的時候,我們總是被告知默認情況下對象是按照引用傳遞的,其實這是個誤區(qū),不完全正確。PHP的對象變量存儲的是此對象的一個標示符而不是對象值,通過此標示符可以訪問真正...
摘要:引用可以被看作是文件系統(tǒng)中的硬鏈接。如果具有引用的數(shù)組被復(fù)制,其值不會解除引用。如果試圖這樣從函數(shù)返回引用,將會報錯,因為函數(shù)在試圖返回一個表達式的結(jié)果而不是一個引用的變量。這并不意味著變量內(nèi)容被銷毀了。 1. 什么是引用 在 PHP 中引用是指用不同的名字訪問同一個變量內(nèi)容。PHP 中的變量名和變量內(nèi)容是不一樣的, 因此同樣的內(nèi)容可以有不同的名字。最接近的比喻是 Unix 的文件名和...
摘要:中的對象傳遞然后說一下之后的默認情況下的對象是通過引用傳遞的這件事情。如此時,其實表示的并不是是的引用,和可以說是沒什么關(guān)系的,有關(guān)系的是實例化類得到的對象。 首先引發(fā)這篇博文的是來源于這篇帖子:https://segmentfault.com/q/10... 經(jīng)過了思考之后,我決定把回答思考變成博客做一下記錄,如有不對之處,歡迎指正。 指針與引用 首先,引用和指針是不一樣的,指針在...
摘要:發(fā)布時最大的變動是對象處理方式。這很容易被誤解為引用,但是存儲器的引用與引用是完全不同的概念。使用引用是一件不好的事情,除了引用本身不好,并且還會使性能下降這個事實外,使用引用這種方式會使得代碼難以維護。 showImg(https://segmentfault.com/img/remote/1460000014082570); 去年我參加了很多次會議,其中八次會議里我進行了相關(guān)發(fā)言,...
閱讀 3403·2023-04-26 02:41
閱讀 2445·2023-04-26 00:14
閱讀 2823·2021-08-11 10:22
閱讀 1275·2019-12-27 11:38
閱讀 3571·2019-08-29 18:34
閱讀 2375·2019-08-29 12:13
閱讀 2951·2019-08-26 18:26
閱讀 1834·2019-08-26 16:49