[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 メーリングリストの案内