詳細程式碼如下:
<?php final class Registry { private $data = array(); public function get($key) { return $this->data[$key]; } public function set($key, $value) { $this->data[$key] = $value; } } abstract class Controller { protected $registry; public function construct($registry) { $this->registry = $registry; } } class ControllerCommonHome extends Controller { public function test() { $this->registry->set('load','load'); } } $registry = new Registry(); $con = new ControllerCommonHome($registry); $con->test(); echo $registry->get('load'); ?>
在$con物件初始化時傳入的參數$registry是以何種方式傳入的? 傳值還是傳送位址?如果是傳值,那麼在$con物件執行函數test()時應該不會影響到原始物件$registry,但事實是影響到了registry的值。
但是如果我把$registry改成一個簡單變量,例如$registry = 123,同樣是在$con物件中對$registry賦值,這個時候卻沒有影響到原來的變量,仍然是123。
求解
好吧, clone() 建構子。物件是可以克隆的,為啥克隆,就是不希望改變它的早前的狀態
物件不是一般變量,請看下面一段谷歌搜到的
物件傳遞
PHP5使用了Zend引擎II,物件儲存於獨立的結構Object Store中,而不像其它一般變數那樣儲存於Zval中(在PHP4中物件和一般變數一樣儲存於Zval )。在Zval中僅儲存物件的指標而非內容(value)。當我們複製一個物件或將一個物件當作參數傳遞給一個函數時,我們不需要複製資料。僅保持相同的物件指標並由另一個zval通知現在這個特定的物件所指向的Object Store。由於物件本身位於Object Store,我們對它所做的任何改變將影響到所有持有該物件指標的zval結構----表現在程式中就是目標物件的任何變更都會影響到來源物件。 。這使得PHP物件看起來就像總是透過引用(reference)來傳遞,因此PHP中物件預設為透過「引用」傳遞,你不再需要像在PHP4中那樣使用&來宣告。
這種問題我以前都沒想過,看到你的問題才去找資料的
以上是php中關於類別的建構子參數問題的解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!