オブジェクト指向プログラミングの広範な開発により、オブジェクト指向プログラミングは多くの興味深い問題を明らかにしました。多くの初心者はphpオブジェクト指向を学ぶ際に、コンストラクターとデストラクターという2つの関数に触れることがあると思います。コンストラクターの使用が多く、デストラクターの使用は少ないようです (初心者の限られたプログラミング経験と比較すると、作成者にも同じことが当てはまります)。機能的には、コンストラクターはオブジェクトの作成時に呼び出され、デストラクターはオブジェクトの作成時に呼び出されます。オブジェクトを破棄する場合は、特に片端と片端を呼び出す必要はありません。 デストラクタがよく扱うのは、前に fopen() があり、ここで fclose() が呼び出され、前で imagecreatefromjepg() が呼び出され、ここで imagedestory() が呼び出されるような、いくつかのリソース解放タスクです。これらは一般的な例の一部ですが、もちろんこれに限定されるものではありません。これは、オブジェクトが破棄されるか、スクリプトが実行されるときに実行される通常の関数として扱うことができます。 以上のことを踏まえて、早速今日の主な質問を提起しましょう:
<?php class Test{ public function destruct(){ echo "执行析构函数"; } } $test1=new Test; $test2=$test3=$test1; unset($test1); echo "<hr/>";
このスクリプトを実行した結果は何ですか? この質問に答える前に、上でマークした言葉を振り返ってください。出力区切り線 unset
($test1
)の前に、デストラクターが呼び出され、テキストが出力されることは当然のことと考えてください。スクリプト デストラクターは実行後に呼び出されます。つまり、分割線の上には 1 段落のテキストが出力され、分割線の下には 2 段落のテキストが出力されます。 現時点では、デストラクターをいつ呼び出すべきかを知っているので、少し誇りに思ってもいいでしょう。しかし、本当にそうなのでしょうか?実行結果を見てみましょう。
おい、くそ、なぜたった一文を出力したんだ? ? ? 実際、私たちは重要な前提条件を見落としていました。それは、デフォルトでのオブジェクトの割り当ては参照割り当てであるということです。この点に気づいていない人も多いので、初心者の方はもっと注意してほしいと思います。 これは参照割り当てであるため、通常の変数の理解を組み合わせると、3 つの変数名が同じストレージ アドレスを指しているとすぐに考えられました。この場合、unset($test1
)はどのような役割を果たすのでしょうか? ? ?ストレージアドレスを指す変数を破棄しますか、それともストレージアドレスに格納されているコンテンツを破棄しますか?
unset() 関数の使い方を直感的に理解している場合は、この段落を読み飛ばしてください。 この辛い問題について考えて、マニュアルを確認してみてはいかがでしょうか。同じく参照渡しで、格納アドレスを指す変数名だけが破棄されます。通常の unset() 関数と組み合わせると、次のように記述できます。
複数の変数名またはオブジェクト名がストレージ アドレスを指している場合、unset() 関数の機能は、変数名のポインターを破棄するだけであり、変数名またはオブジェクト名が 1 つしかない場合、unset を指定すると、指定されたストレージ アドレスの内容が破棄されます。実際のストレージコンテンツはテレビであると想像できます。複数の人 (複数の変数名またはオブジェクト名) がテレビを見ています。 unset() の後、視聴をやめて立ち去る人は誰もいませんでしたが、テレビはまだ付いていました。 1 人だけがテレビを見ている場合、unset() の後、その人が離れるときにテレビの電源を切る必要があります。これは、占有されていたストレージ領域を解放するためです。この部分の内容に興味がある場合は、「PHP 再帰関数の 3 つの実装方法」もご覧ください。 さて、本題に戻ります。
unset($test1)後も、元のオブジェクトはまだそこにあります。分割線が出力されるとスクリプトが実行され、デストラクタが呼び出されます。 オブジェクトが 1 つしかないため、デストラクターの呼び出しは 1 回だけ呼び出されます。上記の結果が出力されるのは当然です。
その他の関連する興味深い質問: プログラム内でデストラクターを呼び出す方法はたくさんあります。オブジェクトが null または false に設定されているかどうかに関係なく、他のオブジェクトは影響を受けません。ここも通常の変数とは異なります。 (unset() 関数の効果は同じです)。興味があれば試してみてください。
もう一つ恥ずかしいこと: コンストラクターがconstruct()を使用できることは誰もが知っていますが、同じ名前のコンストラクターを無視します。したがって、誰もが注意を払う必要があります。
以上がPHPデストラクタの問題を解決するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。