call_user_func_array
メソッドを呼び出したクラスの名前を調べることは可能ですか?ここでは例です:call_user_func_arrayを呼び出したクラスを確認する
// ClassA
public static function __callStatic($method, $args)
{
return call_user_func_array([ClassB::some_method(static::$some_arg), $method], $args);
}
// ClassB
public static function some_method($some_arg) {
// how do I find out that some_method was called by ClassA?
}
some_method
は、それがClassA
によって呼び出されたことを知っているために目標があります。また、ClassB::some_method(static::$some_arg)
がメソッドを静的に呼び出し、の$method
がチェーンされていることにも注意してください。
補足として、call_user_func_array
をreturn DB::some_method(static::$some_arg)->$method(extract($args));
に置き換えようとしましたが、期待通りに機能しませんでした。理由は何ですか?
編集
私は最初の質問に少し複雑です。クラスClassA_Child
があることを今想像:
class ClassA_Child extends ClassA {}
ClassA_Child
今ClassB
のメソッドを呼び出すことができます - some_method
。コールは、ClassA_Child
がClassA
のサブクラスであるため、これが有効である
ClassA_Child::some_method;
だろう。しかし、私は次の操作を実行した場合:バックトレースはsome_method
は、基本クラスClassA
、ないClassA_Child
によって呼び出されたことを示していること
// ClassB
public static function some_method($some_arg) {
$bt = debug_backtrace();
$caller_class = (isset($bt[1]['class']) ? $bt[1]['class'] : null);
echo $caller_class; // ClassA, and NOT ClassA_Child!
}
注意。それを修正する方法はありますか?
私は、あなたの編集を見ました[ 1] $ bt [2]?クラスを上に移動すると、静的呼び出しがClassAまたはClassA_Childで発生したかどうかを確認できます。 – Johnny
some_methodには、正しい一貫性のある結果を返すパラメータセットが必要です。同じクラスのいくつかの場所から関数を呼び出す必要があり、わずかに異なる結果が必要な場合はどうでしょうか。また、このタイプのコーディングは、プロジェクトとチームが成長するにつれて、文書化し維持することが困難です。 – user2182349