或者,我的变量是否保留了对象本身?
当我说例如:
$obj = new ClassOne();
是$ obj指向内存中创建的对象的指针?它只保存对象的内存地址吗?或者它是否持有对象本身?
例如,当我说,
$obj = new SomeOtherClass();
ClassOne对象会像JAVA一样被垃圾收集,还是会像C ++一样导致内存泄漏?
答案 0 :(得分:2)
答案 1 :(得分:2)
PHP中没有指针。保存对象的变量包含对象标识符或对象引用。这是一个基本上是object
类型的变量,其值为42
(或者内部对象标识符是什么)。它是一个引用对象的值,它存储在内存中的某个位置。它不是指针或内存地址。将另一个对象分配给变量会为变量分配另一个对象标识符,它不会更改任何内存地址或先前分配的对象。
答案 2 :(得分:0)
简而言之,C ++和Java中的对象模型有点不同:
C ++具有无约束变量:每个对象类型都可以作为变量对象的类型出现。换句话说,变量可以是任何类型的对象。 (但并非所有变量都是对象(例如引用)!)此外,所有变量都是作用域的,因此所有对象的生命周期 - 这些变量也是自动限定范围的。只有动态分配的对象永远不能是变量,它们只能通过指针和引用来处理。
在Java中,如果我们忽略原始类型,变量是从不对象,对象永远不能是变量。所有对象总是“神奇地在其他地方”(例如“GC堆”),并且您只能通过类似指针的句柄来处理它们。在Java中,类型为T
的变量始终是对T
类型的实际对象的引用,它居住在其他地方。变量也是作用域的,就像在C ++中一样,但是所有Java 对象的生命周期都是不确定的,并且只能保证超出给定对象的所有引用的生命周期。
(内置的“值”类型的情况不同,如int
,其中可以作为变量的类型出现,实际上不能< / em>动态分配。)
我认为PHP在这方面类似于Java。