或者,我的变量是否包含对象本身?
例如,当我说:
$obj = new ClassOne();
$obj 是指向在内存中创建的对象的指针吗?它是否只保存对象的内存地址?还是它持有对象本身?
例如,当我说,
$obj = new SomeOtherClass();
ClassOne 对象会像在 JAVA 中那样被垃圾收集,还是会像在 C++ 中那样导致内存泄漏?
或者,我的变量是否包含对象本身?
例如,当我说:
$obj = new ClassOne();
$obj 是指向在内存中创建的对象的指针吗?它是否只保存对象的内存地址?还是它持有对象本身?
例如,当我说,
$obj = new SomeOtherClass();
ClassOne 对象会像在 JAVA 中那样被垃圾收集,还是会像在 C++ 中那样导致内存泄漏?
PHP中没有指针。保存对象的变量保存对象标识符或对象引用。那是一个基本上具有值类型object
的变量42
(或任何内部对象标识符)。它是一个引用对象的值,该对象存储在内存中的某个位置。它不是指针或内存地址。将另一个对象分配给变量会为变量分配另一个对象标识符,它不会改变任何内存地址或先前分配的对象。
简而言之,C++ 和 Java 中的对象模型有些不同:
C++ 具有不受约束的变量:每个对象类型都可以作为变量对象的类型出现。换句话说,变量可以是任何类型的对象。(但并非所有变量都是对象(例如引用)!)此外,所有变量都是范围的,因此所有变量对象的生命周期也是自动范围的。只有动态分配的对象永远不能是变量,它们只能通过指针和引用来处理。
在Java中,如果我们忽略原始类型,变量就永远不是对象,对象也永远不是变量。所有对象总是“神奇地存在于其他地方”(例如“GC 堆”),您只能通过类似指针的句柄来处理它们。在 Java 中,类型变量T
始终是对实际T
存在于其他地方的类型对象的引用。变量也是有作用域的,就像在 C++ 中一样,但是所有 Java对象的生命周期是不确定的,并且只能保证超出对给定对象的所有引用的生命周期。
(The situation is different for built-in, "value"-type types like int
, which can occur as the type of variables, and in fact cannot be allocated dynamically.)
I think PHP is similar to Java in that regard.