質問: new Person('鈴木', '京子'); $p1->show(); ?> ``` <表示結果> ``` 私の名前は 田中 幸太郎です。 私の名前は 鈴木 京子です。 インスタンスが破棄されました。 インスタンスが破棄されました。 ``` 説明にある、 「オブジェクトが破棄されるタイミングで実行されるのがデストラクタです。」 「デストラクタには、クラスの中で使用したリソースを破棄するなど、主に終了するときの処理を記述するのが一般的です。」 これらの意味がわかりません。 コンストラクタの 「new 演算子によってインスタンス化されるタイミングで実行される」 「プロパティの初期化」 などの意味は理解できているつもりです。 デストラクタを使うと「オブジェクトが破棄される」、「クラスの中で使用したリソースを破棄する」とありますが、『一度インスタンスを作るとクラス内のリソースが破棄されるのかな?』と思い、試しにもう一つインスタンスを作成しました。上記の通り問題なく使えています。 膨大な記述になると、クラス、この場合は 「class Person」」は再利用出来なくすると言った意味になるのでしょうか? 他の教材やネットで検索してみたりしたのですが、イメージがつかめません。 以下のPHP公式のサイトから考えてみると、クラス内で参照できるものがなければ、コールされるという風に解釈できるかもしれませんが、意味がわかりません。 デストラクタ(__destruct)はコンストラクタ(__construct)の反対というように記述されているものもありますが余計に意味が分かりません。 初学者にもわかるようにデストラクタについて教えてもらえないでしょうか? またどういうケースで利用するのかもよく分かりません。 そのあたりも併せて教えて下さい。 宜しくお願いいたいます。 **参考:** デストラクタ | PHP Manual > > > ``` > __destruct(): void > > ``` > > PHP には、C++ のような他のオブジェクト指向言語に似たデストラクタの概念があります。 デストラクタメソッドは、 特定のオブジェクトを参照するリファレンスがひとつもなくなったときにコールされます。 あるいは、スクリプトの終了時にも順不同でコールされます。 > > >
回答: > > 他の教材やネットで検索してみたりしたのですが、イメージがつかめません。以下のPHP公式のサイトから考えてみると、クラス内で参照できるものがなければ、コールされるという風に解釈できるかもしれませんが、意味がわかりません。 > > > #### 原文(英語) PHP: Constructors and Destructors > > **Destructor** > > > PHP possesses a destructor concept similar to that of other object-oriented languages, such as C++. The destructor method will be called as soon as there are no other references to a particular object, or in any order during the shutdown sequence. > > > 例えば関数内のローカル変数を考えてみると良いかもしれません。以下にサンプルコードを示しますが、`NewPerson()` 関数の実行が完了した時点で destructor が実行されている事が判ります。 ``` show(); } NewPerson(); echo "Done."; $p = new Person('山田', '太郎'); $p->show(); echo "Exit."; ``` #### 実行結果 ``` 私の名前は 田中 幸太郎です。 インスタンスが破棄されました。 Done. 私の名前は 山田 太郎です。 Exit. インスタンスが破棄されました。 ```