首页  >  文章  >  后端开发  >  php中关于类的构造函数参数问题的解决

php中关于类的构造函数参数问题的解决

黄舟
黄舟原创
2017-07-02 09:55:092077浏览

详细代码如下:

<?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