3

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

例如,当我说:

$obj = new ClassOne();

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

例如,当我说,

$obj = new SomeOtherClass();

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

4

3 回答 3

2

文档说:

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

阅读文档。这就是它被写出来的原因。

于 2013-01-19T10:47:52.290 回答
2

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

于 2013-01-19T10:49:58.620 回答
0

简而言之,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.

于 2013-01-19T10:51:03.707 回答