欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

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

程序员文章站 2022-04-30 11:14:35
...
详细代码如下:
<?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 题的 参数