php - 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;
}
}
}
先验知识
问题
- 既然我在
MyClass->in
and中有对象,我现在是否将内存使用量加倍MyClass->out
? - 如果我使用一种方法,
obj0
或者obj1
我是否在写入时强制复制,即使它不会更改这些对象的任何属性值? - 当作为类属性添加时,对象是否仍然通过引用传递?
解决方案
正如您链接到的手册页所说,“对象通过引用传递”这句话并不能很好地描述正在发生的事情。更好的理解方法是,对象的“值”是指向不同空间中存在的东西的句柄、指针或地址。
无论您将其分配给对象属性、数组元素还是普通变量,此“值”都保持不变,并且无论您在何处查看对象的更改都是可见的。复制值使用几个字节(指针的大小),但不会复制对象本身的内存。
作为最后的澄清,“写时复制”中的“写”是指在将现有值从一个地方复制到另一个之后对其进行修改。所以写where是一个数组,不会复制数组使用的内存,而是后续写or会,因为需要区分两个副本。这在您的示例中实际上并没有发挥作用;如果是这样,那将只是被复制的“对象指针”,因此只需要很少的额外内存。$foo = $bar
$bar
$foo[0]=1;
$bar[0]=1
推荐阅读
- mysql - Sequelize MySQL 处理查询中的本机引用错误 (ManyToMany)
- rabbitmq - 如何在 NestJS 中开发同时使用 Express 和 RabbitMQ 的 API?
- r - R-如何合并两个不同时期的具有相同变量的两个表?
- c++ - 理解 C++ 中的“通用和统一初始化”
- c# - 我的 ASP.NET Core 按钮根本不发送任何内容(ASP.NET Core MVC 和 C#)
- c++ - 正则表达式搜索 C++
- arrays - 可以获取数组中两个给定数字之间的所有整数的方法 - Ruby
- reactjs - sh:1:webpack:未找到
- python - 做简单低通滤波器时的Python数组怪异 - 输出为0
- node.js - 如何在 node.js 中使用 jwt.sign()