PHP4対応プログラムにおいて、ゲッターによるメンバへのアクセスを避けたい状況

PHP4では、

<?php
class Foo
{
    var $bar;

    function setBar()
    {
        $this->bar =& new Bar();
    }

    function getBar()
    {
        return $this->bar;
    }
}

というクラスから生成されたインスタンス $foo の $bar の hello() というメソッドにアクセスしたい場合、

<?php
$foo->getBar()->hello();

とすると Fatal Error というちょっと信じられない事態になるので、

<?php
$foo_bar =& $foo->getBar();
$foo_bar->hello();

とかして回避したりしますね。

ただ、

  • Foo::getBar() が Foo::$bar を return するだけのメソッドである(※ただし現在だけでなく、将来的にもそうであることが保証されている)
  • Foo::$bar へのアクセス権を満たしている

場合に限り、

<?php
$foo->bar->hello();

というキモイがこの際仕方がない的な回避方法も採ることができます。


PHP4で動作するプログラムの場合、

  • インスタンスがクラスのメンバになりうる場合、アクセス権は public にしておく(もちろん public である必要などないという自信がある場合はこの限りではない)
  • インスタンスへはゲッターによってアクセスしない設計にする

とすることで、「あ、やべ、うっかり $foo->getBar()->hello(); とか書いちゃった」というヒューマンエラーとかは未然に防げるのではないでしょうか。


ところで PHP4 と PHP5 の両対応プログラムでオブジェクト指向によってプログラミングする場合、やっかいなのはこの辺なのかなぁという気がしています。

たしかに PHP4 寄りにプログラミングすることで「とりあえず動くもの」は作れますが、

  • PHP4 独特の癖の強いオブジェクト指向プログラミングによりヒューマンエラーが増える可能性がある
  • PHP4 対応のためにバッドノウハウを積まなければならない(ex. $foo =& new Bar())
  • PHP4 向けの記述は PHP5 では非推奨であることが多く、以下のおそらく致命的な問題点がある
    • まともにメンテナンスされていない可能性
    • 5.3, 6で廃止される

という点はやはり気になるところで、オブジェクト指向プログラミングが絡む場合、 PHP4 と PHP5 の両対応は(目に見えないところで)かなり無理があるのかなという印象があります。

今度ちゃんと調べてみようかな。