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


When I instantiate a class in PHP, do I get a pointer to the object?

或者,变量是否包含对象本身?

当我说例如:

$obj = new ClassOne();

$obj是指向在内存中创建的对象的指针吗?它是否只保存对象的内存地址?还是它能承载物体本身?

例如,当我说

$obj = new SomeOtherClass();

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

PHP中没有指针保存对象的变量保存对象标识符对象引用。这是一个类型为object,值为42的变量(或者其他内部对象标识符)。它是一个引用对象的值,对象存储在内存中的某个地方。它不是指针或内存地址。

为变量赋值另一个对象,为变量赋值另一个对象标识符,它不会改变任何内存地址或先前赋值的对象。

文档说:

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

阅读文档。

简单地说,c++和Java中的对象模型有点不同:

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

  • 在Java中,如果忽略基本类型,变量永远不会是对象,而对象永远不会是变量。所有的对象总是"神奇地"在其他地方。(例如"GC堆"),你只能通过类似指针的句柄来处理它们。在Java中,类型T变量总是对存在于其他地方的T类型的实际对象的引用。变量也有作用域,就像在c++中一样,但是所有Java 对象的生存期是不确定的,并且只能保证超出对给定对象的所有引用的生存期。

    (对于内置的"value"类型的类型,如int,情况不同,可以作为变量的类型出现,实际上不能动态地分配)

  • 我认为PHP在这方面与Java相似。