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;
}
}
}
先验知识
问题
- 由于我在
MyClass->in
和 MyClass->out
中有对象,我现在是否将内存使用量加倍?
- 如果我使用
obj0
或 obj1
的方法,我是否会在写入时强制复制一个副本,即使它不会更改这些对象的任何属性值?
- 添加为 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",因此只需要很少的额外内存。
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;
}
}
}
先验知识
问题
- 由于我在
MyClass->in
和MyClass->out
中有对象,我现在是否将内存使用量加倍? - 如果我使用
obj0
或obj1
的方法,我是否会在写入时强制复制一个副本,即使它不会更改这些对象的任何属性值? - 添加为 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",因此只需要很少的额外内存。