2011年8月28日日曜日

PHP 5.4、一体どこへ向かってるのか?

筆者は何度となく、
  • 「mix-inは必要」
  • 「そのための多重継承は必要(悪)」
論じておりますが、PHPも5.4に至ってようやくmix-in専用機能がついたらしい。

サンプルソースはここから拝借。
http://simas.posterous.com/new-to-php-54-traits

trait Singleton {
public static function getInstance() { ... }
}
class A {
use Singleton;
// ...}
class B extends ArrayObject {
use Singleton;
// ...}
// Singleton method is now available for both classesA::getInstance();
trait??トレイト???辞書を引くと「特徴」という意味らしい。

うーん。また気持ち悪い英単語を持ってきましたね。苦肉の策って感じです。

PHPの機能拡張に置ける伝統的なセンスとして
  • 配列でなんとかする。call_user_funcでのオブジェクトメソッド呼び出しとか。
  • 文字列で渡す。クロージャっぽい事をやるときとか。
  • 予約語を1個づつ増やす。今回のコレ。
という印象をもっており、またしてもtraitとuseを増やしてきました。予約語を増やすにしても、単語1個づつでどうにかしたい感がしますね。

例えば、こうは出来なかったのか?(1)
mixin class A {}
class B {
  mixin use A;
}

理想をいえば、こうですね。(2)
class B extends A uses XC,XD implements IE,IF {}

「定義の内側に、何かを加えて何とかする」感はperlのOOPを思い出します。ただしperlは、サードパーティライブラリなので、本体を改造できないのはともかく、開発元のはずのZendがやるってのに、こんな手抜き感実装ってどうなの?