php5→php4な状況で困ること(1)

php5での開発になじんでしまうと、php4に戻った時にいろいろと引っかかります。4→5の時はスムーズだったのに、いざ5に慣れると「こんなこともできないのか」とヘコむことしきり。ちょっと長くなってきたのでメインディッシュは次回に持ち越して、今回は、小さいけどいざと引っかかるとイラつくところを一通りいきます。

カプセル化できない

privateなプロパティやメソッドが書けないので、外から触り放題。コメントに「@access private」とか書いてもどこかむなしい。他にも抽象クラスとかインタフェースが使えないとかもあるけど、まぁそこまでしっかり作り込まなくてもいいかなという気はする。

例外が投げられない

エラー処理は常にその場で。まぁ、これはまだ何とかなるか。例外投げるライブラリとかもまたロクに整備されてないしね。

simpleXMLがない

何だかんだで結構便利だと思う。PEAR::XML_Unserializerももっと使いこなせばいけるかなぁ…

クラスプロパティもクラス定数も書けない

Hoge::$varとか、Host::cnstとかstaticにアクセスできる環境に慣れると、できなくなった時にどうにも手狭に感じてしまいます。クラスに対して固定値を持たせて、そこに外からアクセスしたい、という時にいちいちオブジェクトをnewする必要がないのは便利です。

$obj =& new Hoge();
$target = $obj->value;

よりも、「$target = Hoge::Value」とか「$target = Hoge::$value」の方がよくない?

selfがない

自クラスのstaticな要素をself::hogeとかで書けるのは便利。まぁ、実際には今のphpだとstaticな要素を$this->で呼び出しても動いてくれたりしますが、書き方としては明らかにおかしいし、今後はできなくなっていく予定らしいので。

__constructできない
function __construct()

php5 だと、こんな感じでコンストラクタが書けます。コピペで新しいクラスを作るのも簡単だし、何らかの事情でクラス名を変更した時もコンストラクタはそのまま使えます。で、これに慣れちゃうとphp4でクラス名を変更した時に、コンストラクタの名前を書き換え忘れて「動かNeeeee!」になります(不注意なだけとか言うな)。クラス名を頻繁に変更するような設計はよくないという意見もあるかもしれませんが、それと実際に変更する手間が大きいことは別の問題だと思います。
それに、サブクラスで親クラスのコンストラクタを parent::__construct() で呼び出せるのはすごく気持ちいい。php4だと、親のコンストラクタを呼ぶのに親のクラス名をハードコーディングするしかなくて、親のクラス名を変更しようと思ったらそれこそ一大事です。

リフレクションが全部小文字

クラス名を動的に処理する時なんかにわりと面倒だったり、分かりづらかったり。クラス名と対応したファイルを読み込ませる時とか困ります。他には、PEAR::HTML_AJAXを使う時にJavaScriptphpのメソッド名の対応で困ったり。

User::find(1)->toString()とか書けない

この例だと「User::find(1)」でオブジェクトを取得して、そのオブジェクトのtoStringメソッドを呼び出しています。php4でこれを書こうとすると、

$obj =& User::find(1);
$obj->toString();

てな感じで変数を挟んで2行で書くことになります。普段はまだいいんだけど、テストを書くときにこの制限にイラっとしました。テストがどんどん長くなると、全体が把握できなくなってよろしくないですね。
変数が定義されていません: てな感じで変数を挟んで2行で書くことになります。普段はまだいいんだけど、テストを書くときにこの制限にイラっとしました。テストがどんどん長くなると、全体が把握できなくなってよろしくないですね。

他にもいろいろ違いはあるけど、自分の中で「これは困る」と思った経験があるのはこんなところでした。次回はメインディッシュのオブジェクトと参照渡しについて。