首頁  >  文章  >  後端開發  >  php中關於類別的建構子參數問題的解決

php中關於類別的建構子參數問題的解決

黄舟
黄舟原創
2017-07-02 09:55:092030瀏覽

詳細程式碼如下:

<?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(&#39;load&#39;,&#39;load&#39;);
    }
}
$registry = new Registry();
$con = new ControllerCommonHome($registry);
$con->test();
echo $registry->get(&#39;load&#39;);
?>

在$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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn