首页 > 解决方案 > PHP 5 | 通过引用/值传递的对象与写入时复制 | 添加为类属性时

问题描述

class MyClass {
    // data going in
    private $in;
    // data going out
    public $out;
    // constructor
    public function __construct($obj0, $obj1) {
        $this->in = array('obj0' => $obj0, 'obj1' => $obj1);
        $this->out = array();
    }
    // method
    public function process() {
        foreach ($this->in as $key => $value) {
            $this->out[$key] = $value;
        }
    }        
}

先验知识

  1. 对象默认通过引用传递,但也有边缘情况
  2. PHP 在写入时使用复制

问题

  1. 既然我在MyClass->inand中有对象,我现在是否将内存使用量加倍MyClass->out
  2. 如果我使用一种方法,obj0或者obj1我是否在写入时强制复制,即使它不会更改这些对象的任何属性值?
  3. 当作为类属性添加时,对象是否仍然通过引用传递?

标签: phpoopobjectpass-by-referencephp-5.6

解决方案


正如您链接到的手册页所说,“对象通过引用传递”这句话并不能很好地描述正在发生的事情。更好的理解方法是,对象的“值”是指向不同空间中存在的东西的句柄、指针或地址。

无论您将其分配给对象属性、数组元素还是普通变量,此“值”都保持不变,并且无论您在何处查看对象的更改都是可见的。复制值使用几个字节(指针的大小),但不会复制对象本身的内存。

作为最后的澄清,“写时复制”中的“写”是指在将现有值从一个地方复制到另一个之后对其进行修改。所以写where是一个数组,不会复制数组使用的内存,而是后续写or会,因为需要区分两个副本。这在您的示例中实际上并没有发挥作用;如果是这样,那将只是被复制的“对象指针”,因此只需要很少的额外内存。$foo = $bar$bar$foo[0]=1;$bar[0]=1


推荐阅读