1

メソッドが静的かどうかを知らなくてもメソッドを呼び出せるようにする必要があります。

たとえば、これは機能せず、次のようにしたいと思います。

class Groups {
    public function fetchAll($arg1, $arg2){
        return $this->otherFunction();
    }
    public static function alsoFetchAll($arg1, $arg2){}
}

$arguments = array('one', 'two');
$result = call_user_func_array(array('Groups', 'fetchAll'), $arguments);
$result = call_user_func_array(array('Groups', 'alsoFetchAll'), $arguments);

インスタンス変数のエラーが発生しました:

Fatal error: Using $this when not in object context

機能しない理由は、インスタンス変数が機能するようにクラスをインスタンス化する必要があるためです。しかし、私のコンストラクターは引数を取らないので、このステップをスキップする簡単な方法が必要です。

どのようなメソッドであるかを問わないようにするにはどうすればよいでしょうか。

4

2 に答える 2

2

リフレクションでこれを行うことができます。次の変数があると仮定します。

$class = 'Groups';
$params = array(1, 'two');

次に、クラスの新しいインスタンスを作成できます。

$ref = new ReflectionClass( $class);
$instance = $ref->newInstance();

そして、両方のメソッドを同じ方法で呼び出し、完全を期すためにそれらが静的かどうかを確認します。

$method = $ref->getMethod( 'fetchAll');
$method->invokeArgs( ($method->isStatic() ? null : $instance), $params);

$method = $ref->getMethod( 'alsoFetchAll');
$method->invokeArgs( ($method->isStatic() ? null : $instance), $params);

ただし、それらが静的であることを確認する必要はありません。メソッドが静的であるかどうかに関係なく、これを簡単に行うことができます。

$ref->getMethod( 'fetchAll')->invokeArgs( $instance, $params);
$ref->getMethod( 'alsoFetchAll')->invokeArgs( $instance, $params);

このデモで動作することがわかります。

編集: エラー/警告/通知なしで、これがOPのユースケースで機能することを示すデモがあります。

于 2012-08-28T18:09:02.770 に答える
1

設計上の問題があると思います。インスタンス メソッドが必要な場合はインスタンスが必要なので、おそらくそのインスタンスのプロパティにアクセスする必要があります。

静的メソッドが必要な場合は、インスタンスを参照する必要がないため、 を使用してくださいcall_user_func_array。リポジトリメソッドを扱っているので、問題なく静的にすることができます-とにかく解決策が必要な場合:

function callMethod($class, $method, $arguments)
{

    // if there is no such method, return
    $info = new ReflectionClass($class);
    if(!$info -> hasMethod($method))
        return false;

    // let's find if desired method is static - create a temporary instance in case
    foreach($info -> getMethods(ReflectionMethod::IS_STATIC) as $method)
    {

        if($method['name'] == $method)
        {

            $class = $info -> newInstance;
            break;

        }

    }

    return call_user_func_array(array($class, $method), $arguments);

}
于 2012-08-28T18:07:57.450 に答える