摘要:在中使用對象的時候,我們總是被告知默認情況下對象是按照引用傳遞的,其實這是個誤區,不完全正確。我們從下面的示例來分析此時的關系此時的關系如果對象是按照引用傳遞的,那么輸出的內容應該一樣,事實上結果并非如此。
在PHP中使用對象的時候,我們總是被告知“默認情況下對象是按照引用傳遞的”,其實這是個誤區,不完全正確。PHP的對象變量存儲的是此對象的一個標示符而不是對象值,通過此標示符可以訪問真正的對象的內容,那么在對象作為參數被傳遞,作為結果返回,或者賦值給另外一個變量時,其實傳遞的就是這個標示符,他們之間的關系是兩個變量都保持了同一標示符的拷貝,而并不是引用。
我們從下面的示例來分析
PHPclass A {}; class B {}; $a = new A; $b = $a; $b->testA = "Changed Class A"; /* * 此時$a,$b的關系: * +-----------+ +-----------------+ * $a --> | object id | ---> | object(Class A) | * +-----------+ +-----------------+ * ^ * +-----------+ | * $b --> | object id | ---------+ * +-----------+ * * */ $c = new B; $a = $c; $a->testB = "Changed Class B"; /* * 此時$a,$b,$c的關系: * +-----------+ +-----------------+ * $b --> | object id | ---> | object(Class A) | * +-----------+ +-----------------+ * * +------------+ * $a --> | object id2 | -------------+ * +------------+ | * v * +------------+ +-----------------+ * $c --> | object id2 | ---> | object(Class B) | * +------------+ +-----------------+ */ var_dump($a); //["testB"]=> string(15) "Changed Class B" var_dump($b); //["testA"] => string(15) "Changed Class A" var_dump($c); //["testB"]=> string(15) "Changed Class B" //如果對象是按照引用傳遞的,那么$a, $b, $c輸出的內容應該一樣,事實上結果并非如此。 看下面通過引用傳遞對象的列子: testA = 2; /* * 此時$aa, $bb的關系: * * +-----------+ +-----------------+ * $bb --> | object id | ---> | object(Class A) | * +-----------+ +-----------------+ * ^ * | * $aa ---------+ * * */ $cc = new B; $aa = $cc; $aa->testB = "Changed Class B"; /* * 此時$aa, $bb, $cc的關系: * * +-----------+ +-----------------+ * | object id | ---> | object(Class A) | * +-----------+ +-----------------+ * * $bb ---->-----+ * | * $aa ---->-----+ * | * v * +------------+ * | object id2 | --------------+ * +------------+ | * v * +------------+ +-----------------+ * $cc --> | object id2 | ---> | object(Class B) | * +------------+ +-----------------+ */ var_dump($aa); //["testB"]=>string(15) "Changed Class B" var_dump($bb); //["testB"]=>string(15) "Changed Class B" var_dump($cc); //["testB"]=>string(15) "Changed Class B" //此時$aa,$bb,$cc三者內容完全一樣,所以可以看出對象默認并不是按照引用傳遞,要盡快走出這個誤區。
參考文章:http://php.net/manual/zh/language.oop5.references.php
http://weizhifeng.net/php-reference.html
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/20992.html
摘要:深入系列第九篇,除了按值傳遞引用傳遞,還有第三種傳遞方式按共享傳遞定義在高級程序設計第三版,講到傳遞參數中所有函數的參數都是按值傳遞的。 JavaScript深入系列第九篇,除了按值傳遞、引用傳遞,還有第三種傳遞方式 —— 按共享傳遞 定義 在《JavaScript高級程序設計》第三版 4.1.3,講到傳遞參數: ECMAScript中所有函數的參數都是按值傳遞的。 什么是按值傳遞呢?...
摘要:接著下一個例子賦予副本新的地址可見,函數參數傳遞的并不是變量的引用,而是變量拷貝的副本,當變量是原始類型時,這個副本就是值本身,當變量是引用類型是,這個副本是指向堆內存的地址。 轉載自ConardLi: 《【JS進階】 你真的掌握變量和類型了嗎》 公眾號: code秘密花園 1. JavaScript數據類型 ECMAScript標準規定了7種數據類型,這些數據類型分為原始類型和對象...
摘要:按引用傳遞時,函數的形參接收實參的隱式引用,而不再是副本。探究值的傳遞方式的基本類型,是按值傳遞的。但這樣是否說明的對象是按引用傳遞的呢我們再看下面的例子仍然是并未被修改為如果是按引用傳遞,修改形參的值,應該影響到實參才對。 最近遇到個有趣的問題:JS中的值是按值傳遞,還是按引用傳遞呢? 在分析這個問題之前,我們需了解什么是按值傳遞(call by value),什么是按引用傳遞(ca...
摘要:講清楚之參數傳值參數傳值是指函數調用時,給函數傳遞配置或運行參數的行為,包括通過進行傳值。所以對的賦值會改變上下文棧中標識符保存的具體值此時如果使用的是按引用傳遞,則變量所指向的對象因該也被賦值為。 講清楚之 javascript 參數傳值 參數傳值是指函數調用時,給函數傳遞配置或運行參數的行為,包括通過call、apply 進行傳值。 在實際開發中,我們總結javascript參數傳...
閱讀 798·2021-09-06 15:02
閱讀 2439·2019-08-30 15:43
閱讀 2164·2019-08-30 11:26
閱讀 2372·2019-08-26 12:12
閱讀 3538·2019-08-23 18:24
閱讀 3254·2019-08-23 18:16
閱讀 695·2019-08-23 17:02
閱讀 2241·2019-08-23 15:34