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 では、typeの変数Tは常に、別のT場所にある type の実際のオブジェクトへの参照です。変数も C++ のようにスコープ指定されますが、すべての Javaオブジェクトの存続期間は不確定であり、特定のオブジェクトへのすべての参照の存続期間を超えて延長されることが保証されているだけです。

    (変数の型として発生する可能性があり、実際にint動的に割り当てることができないのような組み込みの「値」型の型の場合は状況が異なります。)

  • その点では、PHP は Java に似ていると思います。

于 2013-01-19T10:51:03.707 に答える