当我在PHP中实例化一个类时,我是否得到一个指向该对象的指针?

时间:2013-01-19 10:44:05

标签: php object instance-variables

或者,我的变量是否保留了对象本身?

当我说例如:

$obj = new ClassOne();

是$ obj指向内存中创建的对象的指针?它只保存对象的内存地址吗?或者它是否持有对象本身?

例如,当我说,

$obj = new SomeOtherClass();

ClassOne对象会像JAVA一样被垃圾收集,还是会像C ++一样导致内存泄漏?

3 个答案:

答案 0 :(得分:2)

The documentation说:

  

PHP以与引用或句柄相同的方式处理对象,这意味着每个变量都包含一个对象引用而不是整个对象的副本。请参阅对象和参考。

阅读文档。这就是它写成的原因。

答案 1 :(得分:2)

PHP中没有指针。保存对象的变量包含对象标识符对象引用。这是一个基本上是object类型的变量,其值为42(或者内部对象标识符是什么)。它是一个引用对象的值,它存储在内存中的某个位置。它不是指针或内存地址。将另一个对象分配给变量会为变量分配另一个对象标识符,它不会更改任何内存地址或先前分配的对象。

答案 2 :(得分:0)

简而言之,C ++和Java中的对象模型有点不同:

  • C ++具有无约束变量:每个对象类型都可以作为变量对象的类型出现。换句话说,变量可以是任何类型的对象。 (但并非所有变量都是对象(例如引用)!)此外,所有变量都是作用域的,因此所有对象的生命周期 - 这些变量也是自动限定范围的。只有动态分配的对象永远不能是变量,它们只能通过指针和引用来处理。

  • 在Java中,如果我们忽略原始类型,变量是从不对象,对象永远不能是变量。所有对象总是“神奇地在其他地方”(例如“GC堆”),并且您只能通过类似指针的句柄来处理它们。在Java中,类型为T变量始终是对T类型的实际对象的引用,它居住在其他地方。变量也是作用域的,就像在C ++中一样,但是所有Java 对象的生命周期都是不确定的,并且只能保证超出给定对象的所有引用的生命周期。

    (内置的“值”类型的情况不同,如int,其中可以作为变量的类型出现,实际上不能< / em>动态分配。)

  • 我认为PHP在这方面类似于Java。