PHP 5 |通过引用/值传递的对象与写入时复制 |添加为 class 属性 时

PHP 5 | Objects Passed by Reference / Value vs Copy on Write | When added as class property

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. Objects are passed by reference by default, but there are edge cases
  2. PHP uses copy on write

问题

  1. 由于我在 MyClass->inMyClass->out 中有对象,我现在是否将内存使用量加倍?
  2. 如果我使用 obj0obj1 的方法,我是否会在写入时强制复制一个副本,即使它不会更改这些对象的任何属性值?
  3. 添加为 class 属性 时对象是否仍然通过引用传递?

正如您 link 的手册页所说,语句 "objects are passed by reference" 并不能很好地描述正在发生的事情。更好的理解方式是,对象的 "value" 是指向存在于不同 space.

中的对象的句柄、指针或地址

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

作为最后的澄清,"copy-on-write"中的"write"指的是对现有值的修改after 将它从一个地方复制到另一个地方。所以写 $foo = $bar,其中 $bar 是一个数组,将 而不是 复制数组使用的内存,但随后写 $foo[0]=1;$bar[0]=1 会,因为需要区分两个副本。这实际上并没有在您的示例中发挥作用;如果是这样,那将只是复制了 "object pointer",因此只需要很少的额外内存。