PHP4でオブジェクトをデフォルト参照渡しっぽく扱う

PHP4 では、オブジェクトを代入したりすると、オブジェクトは参照渡しではなく、コピーになりますが、これを擬似的に、参照渡しっぽく扱える方法を思いついたので、メモメモ。


例えば次の例ですが、

$user_model =& Model::get_model('User');
$user1 = $user_model->find(95);
$user2 = $user1;

↑これで、通常ならオブジェクトがコピーされて、$user1 と $user2 は別のオブジェクト(変な仕様だけど...)。でも、ちょっと工夫すると...

echo $user1->get_attr('name'); //出力: ぷりっけ
$user2->set_attr('name', 'ぷりごろた');
echo $user1->get_attr('name'); //出力: ぷりごろた

…というような使い方が可能です。


これが出来ると、オブザーバーパターンなんかの構築に便利だし、参照演算子忘れ(アンパサンド地獄!)を気にしないでコーディング出来るし、とっても楽チン♪


★やってることはとても簡単で、オブジェクト生成後、全てのプロパティのリファレンスを、オブジェクトの外の別の変数に代入します。それだけ。


PHP では、リファレンスを含むオブジェクトや配列をコピーする時、そのリファレンスは解消され無いという仕様になっているらしく、それを利用して、リファレンスを作成することでオブジェクトのプロパティを単一の実体に束縛しています。つまり、オブジェクトはコピーされても、プロパティはコピーされないと言う事になります。


まあ、オブジェクトはコピーされてしまっているわけですが、そもそも「オブジェクト」とは、手続きとデータが一緒になったものですから、データ(プロパティ)も一緒、手続き(メソッド)も一緒なら、事実上同一オブジェクトとして扱える、という感じですね。


なお、オブジェクトを使い終わった時に、キャッシュしたリファレンスを解放するのも忘れないように、注意です。