PHPで動的なメンバ関数の追加・変更を行う
Palmer @ 2006/06/30 20:00 | コメント(2)
トラックバック(0)
PHPはメンバ変数の動的な追加・削除は可能だが、メンバ関数を動的にクラスに追加・変更・削除する機能は無い。PHP5ではオーバーロードが標準でサポートされたが、PHP4にはそういう機能は無いので制限ありだがPHP4/5両対応のクラスを作ってみた。
PHP4での制限:
- エラー制御演算子(@)をつけないとWarningが発生する
- 戻り値を受け取ることが出来ない(回避策はあるけど致命的な問題だな・・・)
コード
PHP:
- // 動的な関数の追加を可能にするクラス
- class DF
- {
- function DF() {
- }
- function _GET_FUNCTION($class, $func) {
- }
- function _SET_FUNCTION($class, $func, $args, $code) {
- }
- function _DEL_FUNCTION($class, $func) {
- }
- if ($set) {
- }
- else {
- if ($class != 'df')
- return DF::_GET_FUNCTION($class, $func);
- }
- else
- return $_[$class][$func];
- }
- }
- function __call($func, $args) {
- }
- }
- // 対象のクラスは上記のクラスを継承する必要がある
- class A extends DF {
- function A() { parent::DF(); } // 基底クラスのコンストラクタを必ず呼ぶ
- }
- $a =& new A();
- // (A) メンバ関数を追加する前にコールしてみる
- // (B) メンバ関数を動的に追加してコールする
- A::_SET_FUNCTION('A', 'fn', '$a', 'echo "{$a} + {$a} = "; return $a + $a;');
- // (C) 別の関数を同名で上書きする
- A::_SET_FUNCTION('A', 'fn', '$a, $b', 'echo "{$a} * {$a} = "; $b = $a * $a;');
- // (D) 派生クラスにも追加したメンバ関数は有効
- class B extends A {
- function B() { parent::A(); } // 基底クラスのコンストラクタを必ず呼ぶ
- }
- $b =& new B();
- // (E) 派生クラスでメンバ関数を無効にする
- B::_DEL_FUNCTION('B', 'fn');
- // (F) 派生元ではまだ有効
PHP4での実行結果
CODE:
- (A)
- (B) 2 + 2 =
- (C) 3 * 3 = 9
- (D) 4 * 4 = 16
- (E)
- (F) 6 * 6 = 36
PHP5での実行結果
CODE:
- (A)
- (B) 2 + 2 = 4
- (C) 3 * 3 = 9
- (D) 4 * 4 = 16
- (E)
- (F) 6 * 6 = 36
実用性は無くは無い気がするが、著しく可読性の低いコードが出来上がる悪寒・・・。




PHP 4でoverloadは試されましたか?
http://php.net/overload