質問
これが前提です:
クラスのいずれかのメソッドが呼び出される前にアクションを実行する必要があるクラスがたくさんあります。私の解決策は、すべてのクラスに、次のように見えるcall()関数を定義する親クラスを拡張させることでした。
public function call($method){
//do the something I need to do before method calls
$params = func_get_args();
//remove the $method param from the $params array
unset($params[0]);
return $this->__call($method,$params);
}
そして、コールメソッドを呼び出して呼び出したい実際のメソッドを指定するだけで、その方法はメソッドが呼び出されますが、コールメソッド(クラスが親クラスから継承する)内部では、持ち運ぶ必要があるアクションを実行できました。指定されたメソッドが呼び出される前に出ます。
これは、配列または文字列である可能性のある引数をサポートできる必要があるため、一連の引数を内滅させるものはすべて機能しません(これはすべての引数が文字列であると仮定するからです)。
上記のものが理にかなっているかどうかはわかりません。これを間違った方法で確認してみたいと思いました。
どんなアイデア/考えも大歓迎です。
ありがとう!
PS:上記の状況についての私の説明は、子のクラスが親を拡張する理由のように聞こえるようにする必要があります。実際には、より多くの理由があります(私の親クラスはZend_db_table_abstractを拡張し、データベースモデルは親を拡張します) 。
解決
__call
存在しない関数を呼び出そうとするたびに、定義されている場合、自動的に呼ばれます。それが「魔法」の方法です。それが意図されているコンテキストではなく、直接それを使用するのは奇妙に思えます。ここでは、あなたもそれを何でも命名したかもしれません。
君 たぶん......だろう 間違いなくの力を使用してください __call
ここであなたの有利に。すべてのメンバー関数を前のアンダースコアで名前を付けてみてください。だから、あなたが前に持っていたなら $this->print()
あなたは今持っているでしょう $this->_print()
. 。それから、あなたの中に __call
関数、アンダースコアを追加して、使用して関数を呼び出します call_user_func_array(array($this,"_$name"), $params)
. 。これで、機能を正常に呼び出すことができます(まあ、アンダースコアなしで)。
それでも、私は使用することを提案しません __call
便利な場合を除きます。長期にわたって、直接実行するコードを呼び出すことが最善です。
他のヒント
私はより良い/クリーナーの代替品が、イベントとリスニングシステムをセットアップすることであるかもしれません。 ドクトリンイベントシステム. 。 (そのコードは、実際にはORMの部分ではなく、一般的なライブラリからのものです。)しかし、イベントを派遣するにはすべての方法が必要になります。
プラグインシステムで使用することは問題ないと思いますが、コードを理解して維持するのが難しくなるため、__callをできるだけ使用しないようにしています。
提案ありがとうございます、私は間違った木をbarえるようなものでしたが、ここに私が思いついた解決策があります:
public function call($method){
//do the something I need to do before method calls
$params = func_get_args();
//remove the $method param from the $params array
unset($params[0]);
return call_user_func_array(array($this,$method),$params);
}
もう一度ありがとう!
__callパラメーターからメソッドパラメーターを直接取得できます。
function __call($method, $args) {
return call_user_func_array(array($this,$method),$args);
}