在这份文档的基础上进行跟进:https://www.php.net/manual/en/language.oop5.references.php
PHP面向对象编程的一个关键点经常被提到的是“对象默认通过引用传递”。这并不完全正确。
在PHP中,对象变量并不包含对象本身作为值。它只包含一个对象标识符,该标识符允许对象访问器找到实际的对象。
这实际上是如何工作的呢?例如,在C++中,箭头操作符似乎会隐式地解引用指针,然后像在对象变量本身上访问属性时一样访问属性。
我是这样理解的:
obj->prop (*obj).prop // 等同于上面的行
这看起来非常简洁。在这两种情况下,属性的调用都是对象变量地址与属性偏移量之和。
但是在PHP中,这是如何工作的呢? 文档建议指针并不存储内存地址,而是一个“对象标识符”。在PHP中访问属性是一个高度抽象的过程,还是会将对象标识符解析为内存地址,然后以类似于C++ / Java等方式访问它?
这是一个高度抽象的过程,语法的相似并不意味着代码会像C/C++那样“掉入”工作。你可以深入代码来看看它在底层是如何工作的。