親メソッドを非表示にして、親クラスで定義されたメソッドに対して子クラスの__callマジックメソッドが呼び出されるようにしたいとします。例:PHP:親メソッドを__callでオーバーライドする
class C {
function foo() { echo "foo\n"; }
}
class D extends C {
function __call($method, $args) { echo "called $name\n"; }
}
$d = new D();
$d->foo();
// desired result: called foo
// actual result: foo
私はrename_functionとoverride_functionをチェックしましたが、それらはメソッドでは機能しません。 ReflectionMethodにはsetAccessibleメソッドがありますが、ReflectionMethodインスタンスを使用してメソッドを呼び出す場合にのみ動作するようです。
背景:PHPのタイプチェックを利用できるRPCプロキシクラスを使用しようとしています。したがって、RPCFooを使用している場合は、タイプヒントまたはinstanceofを使用して、そのタイプ($ RPCFooインスタンスFoo)を確認できるようにタイプを適用できます。
編集:基本クラスはプロキシなしでそのまま使用できます。これはプロキシがコードではなくシステム構成の一部となるためです。複数のサーバーをすべて同じコードベースで考えるが、それぞれに特定のタスクを割り当てることができます。ローカルサーバーが要求されたサービスを処理しない場合、クラスローダーは基本クラスの代わりにプロキシを返します。ローカルサーバーが要求されたサービスを処理する場合は、基本クラスを返します。
再編集:提示されたメソッドは実行可能ですが、基本クラスの設計されたインターフェイスをIDEとリフレクションから隠蔽します。私はプロキシの実装をきれいにして、基本クラスから継承してプロキシインタフェースを実装するだけで済むようにしようとしていました。基本クラスのインターフェイスを維持するために、プロキシ開発者は、リモート呼び出しを行うためにすべてのpublicおよびprotectedメソッドを再実装する必要があります。次に、基本クラスで何かが更新されると、プロキシも同様に更新する必要があります。結局のところ、私は単に、リフレクションを使用するプロキシジェネレータを作成するルートを開発者に委ねるつもりだと思います。
返信いただきありがとうございます!私はこの質問は少し古いですけど、私はそれが同じに直面して人々を助けるために、私はそれをここに投稿しそう働いてしまった
class C {
private function foo() {
echo "foo\n";
}
public function __call($method, $args) {
if(is_callable(array($this,$method))) {
return call_user_func_array(array($this,$method), $args);
} else {
trigger_error("Call to undefined method '{$method}'");
}
}
}
この場合、基本クラスはプロキシなしでは使用できません。 –
これは可能ですが、親クラスに魔法の '__call'メソッドを追加し、そこから呼び出されたメソッドを呼び出さなければなりません。私の編集した答え –
でtrigger_errorを見る2012年に...例外を使用してください。)私は、さらに 'call_user_func_array'に' __CLASS__'または 'self'を使用して、 – meze