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

yuji koga koga-y @ mcp-net.com
2004年 6月 3日 (木) 10:56:29 JST


お世話になります。古賀です。
表題の件について、相談に乗って頂きたく思います。

例えば、オブジェクトに、自分自身を削除するメソッドを実装する時は、
通常、以下のように行うと思います。

class A {
  function destroy(){
    unset($this)
  }    
}


しかしながら、

$A = new A();
$A->destroy();

後、

isset($A)

を確認するとTRUE、すなわち$Aは削除されていない、という事になります。

この理由はマニュアルに明記されており、$thisはメソッド内ローカルスコープで
自動的に生成される$Aへの「参照」であり、PHPにおいて「参照」関係にある
変数の一つをunset()しても、他方の変数は削除されないからです。

つまり、destroy()メソッドの中で $thisに対してかけるべき関数は、
 unset()ではなく、「参照関係にある全ての変数を同時に削除する関数」でなければ
ならないことになります。しかしながら、そのような関数の存在を知りません。

皆様はこのような問題をどのように解決しておりますでしょうか?
何か名案・定石をお持ちの方がいらっしゃいましたら、お教え願いたく思います。

----------------------------------------------------------
以下は、質問に至った動機です。
----------------------------------------------------------

また、当然
「unset($A)で充分ではないか?どうしてdestroy()メソッドが必要なのだ?」
という疑問を抱かれる方もいらっしゃると思います。

その理由は2つあります。

1つは、自分のプログラムではインスタンス生成時に参照返しする場面が多く、
例え$Aをunset()したとしても、$Aの参照がどこかで生きているケースがある、
ということです。
2つめは、インスタンス自身に「ある条件を満たしたら、消えなさい」という
仕組みを記述する為に、インスタンスのメソッド内から呼びだせる
destroy()メソッドを必要としているからです。

----------------------------------------------------------
以下は、質問に至った経緯です。
----------------------------------------------------------

自分は今のところ、これらの問題に対処するために、Object Poolパターン
(というのはおこがましい簡単な作りなのですが)のような物をつくり、
インスタンス生成時にObject Pool内にその参照を作っておき、
Object Poolに問い合わせをすることで、ある時点で生成されている全ての
インスタンスを把握出来るようにしています。

そしてインスタンス削除時には、自身のプロパティに「無効フラグ」を立ててから
それ以外のプロパティを消去し、最後にObject Pool内の参照を削除しています。

そうすることで、

$A->destroy();

後も

$A

は残ってしまいますが、その$Aはすでに「無効な」インスタンスであるという
フラグが立っており、さらにObject Poolに問い合わせても、
「そのインスタンスは生成されていません」という返事がくるので問題ない、
という事になります。
しかし、この対処法はになんだか回りくどく、もっとクールでシンプルな対応策は
無いのか?と頭をひねっていました。

以上、長文失礼致しました。


<? /*********************************
株式会社メディアプレス   制作課  古賀裕二
       会社:koga-y @ mcp-net.com
       自宅:yuuukunn @ h7.dion.ne.jp
*********************************/ ?>



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