なんたらノート第三期ベータスマートフォン用の表示で見るスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。読者です読者をやめる読者になる読者になるなんたらノート第三期ベータ2009-11-18PHPで動的継承PHPRubyにある特異クラスや特異メソッドの便利さを、PHPでも実現してみようと試みました。Rubyの特異クラスは、すでにインスタンス化された、クラス不明なオブジェクトに、オーバーライドでメソッドを追加するものです。特異クラスはスクリプト言語ならではの機能です。フレームワークの早い段階でインスタンス化されたオブジェクトが、後半のユーザコードに適合しない場合を考えましょう。フルのラッパークラスを定義してアダプターパターンを適用してしまいそうですが、特異クラスでオブジェクト自体のメソッドを追加・上書きすれば、インターフェースを合わせることができ、面倒なラッパーも要りません。以降、拡張済みオブジェクトはオリジナルオブジェクトのように使えます。JavascriptでもPythonでも、相当のことは簡単にできます。self:...obj.extraMethod()さて、文字列をいちいちパースしているくせに、言語仕様はJavaやC++に近いという変な言語、PHPではどうでしょう?現在のPHPには、特殊なメソッド名がいくつかあり、変数やメソッドがなかった場合のフェイルセーフが考慮されています。http://php.net/manual/ja/language.oop5.overloading.phpこの特殊メソッド名を使って、拡張前のオブジェクトインスタンスをターゲットとして、変数操作やメソッド呼び出しをすべて委譲し、そのうえで、特異メソッド化したいメソッドを自分のクラスに定義すると、ダイナミックなオブジェクト変形ができそうです。そのまま使える?&gt;こんな感じになりました。これ自体の動作を確認してはいませんが、等価な実装でうまく動いてるので、たぶん大丈夫。かたちとしては、自動的なラッパーになったわけですが、そこそこ目的は達成できました。これで、擬似派生クラスのほう(SpecialClass)の実装コードをパースするのを、遅延させることができます。したら派生の必要がないかもしれないので、静的派生のように、毎回派生クラスをパースして負荷をかけるのはばかばかしいです。呼び出しがいったん基底オブジェクトに入ってしまうと、いくら派生側のクラスでオーバーライドしていても、基底オブジェクトのメソッドが呼ばれてしまいます。正しく「継承」ではありません。いう意味で、「デリゲート」と名づけています。動的なスクリプト言語に、静的なクラス継承は似合いませんね。ここから派生し、「値がなかったら委譲先を分岐させる」などして、ミックスインもどきを作ることもできそうです。委譲してしまうと帰ってこないから、オブジェクトを混ぜても、せいぜい、「入り口が同じインスタンスだ」というぐらいの意味にしかならないでしょうけど。Blog|ブログを報告する。