[PHP-users 21960]Re: オブジェクトに、自分自身を削除するメソッドを実装する方法について

T.Okabe okabe @ nsd.jip.co.jp
2004年 6月 3日 (木) 12:43:30 JST


岡部といいます。

>細井です
>
(省略)
>
>名案でもなんでもなくて申し訳ないんですが、思いつきで
>class A {
>  function destroy(){
>    $this = null;
>  }    
>}
>とやってみたら、isset($A)はなくりますね。
>
>但し、$GLOBALS['A']はnullという値が残るという、奇妙な状態になります。
>
>is_object($A)もfalseになるので、それなりにいけるんじゃないかな?
>と思うのですが、どうでしょう?

私も引用の細井さんの案でよいかと思います。(どうしても必要であれば。)

基本的に、使わなくなれば(つまり参照されなくなるので)、
その後、ガーベジされるというものだと思います。
# ガーベジのタイミングはお任せなので、
# PHPだと普通はスクリプト終了時になってしまうでしょうけど。

PHPにおける「参照」(リファレンス)は、本物との参照があるというわけではなくて、
UNIXファイルシステムで言うハードリンクなので、どの参照も同等です。
同じ実体に対して別名をつけているに過ぎず、「ポインタ型」ではないわけです。

unlinkはその「別名」を消すことなので、
実態が消えるのは全ての「別名」が消えたとき
(厳密にはそのあとガーベジコレクションされたとき)になるわけです。

従って、話は戻りますが、nullを代入することは
「実体の変数」に代入されて値を変化させることを意味するので、
元々は入っていたオブジェクトへの「参照」は0になることで、
実質的にもとの投稿のお役に立てるのではないかと。

ちなみに、isset関数に関しては、
「NULLに設定されている変数を調べた場合、isset() はFALSEを返します。」
とマニュアルにありますね。
そして、empty関数を使った場合には、Trueになります。
でもそれはまぁ、いいでしょう。きっと。


PHP-users メーリングリストの案内