PHPでの動的クラスメソッドの呼び出し


87

PHPの同じクラスのメソッドを動的に呼び出す方法はありますか?構文が正しくありませんが、次のようなことをしたいと思っています。

$this->{$methodName}($arg1, $arg2, $arg3);

それは元の質問でしたか?メソッドを動的に呼び出すことを探していましたが、この質問を見つけました。これはandy.gurinで指定された構文と同じであり、質問の更新を示すリンクが表示されません。とにかく...質問してくれてありがとう、そして貢献者に感謝します:-)
Luc M

5
@ Luc-それは元の質問でした。尋ねたところ、構文は正しいことがわかりましたが、コードに何か問題があったため、機能しませんでした。
VirtuosiMedia

回答:


175

これを行うには複数の方法があります。

$this->{$methodName}($arg1, $arg2, $arg3);
$this->$methodName($arg1, $arg2, $arg3);
call_user_func_array(array($this, $methodName), array($arg1, $arg2, $arg3));

リフレクションAPIhttp //php.net/manual/en/class.reflection.phpを使用することもできます


多分私は構文が正しいと思います、それでそれが完全に正しく機能していないので私のコードに何か他のものが間違っています。うーん...–
VirtuosiMedia

あなたのメソッドがオブジェクトで呼び出され、PHPUnitでテストされているなら、うんざりする言葉call_user_func_arrayはあなたのためのものです。
OK必ず

あなたは私の友達、ちょうど私の日を救った!私は電話をしていてcall_user_func_array($this->$name, ...)、なぜそれが機能しないのか疑問に思いました!
PubuduDodangoda19年1


10

PHPでオーバーロードを使用できます: オーバーロード

class Test {

    private $name;

    public function __call($name, $arguments) {
        echo 'Method Name:' . $name . ' Arguments:' . implode(',', $arguments);
        //do a get
        if (preg_match('/^get_(.+)/', $name, $matches)) {
            $var_name = $matches[1];
            return $this->$var_name ? $this->$var_name : $arguments[0];
        }
        //do a set
        if (preg_match('/^set_(.+)/', $name, $matches)) {
            $var_name = $matches[1];
            $this->$var_name = $arguments[0];
        }
    }
}

$obj = new Test();
$obj->set_name('Any String'); //Echo:Method Name: set_name Arguments:Any String
echo $obj->get_name();//Echo:Method Name: get_name Arguments:
                      //return: Any String


3

PHPのクラス内で作業している場合は、PHP5でオーバーロードされた__call関数を使用することをお勧めします。ここでリファレンスを見つけることができます

基本的に、__ callは動的関数に対して、__ setおよび__getがOOPHP5の変数に対して実行することを実行します。


2

これらすべての年後もまだ有効です!ユーザー定義のコンテンツである場合は、必ず$ methodNameをトリミングしてください。$ this-> $ methodNameを機能させるには、先頭にスペースがあることに気付くまではできませんでした。


ユーザー定義のコンテンツの場合は、名前を削除するだけではありません。など...セキュリティチェックしてください!;)
Erk 2016年

インターネットのどこかで、ユーザーが入力したutf8をWindowsで安全な文字に変換する方法を詳しく説明しました。QuickBooksのは、そのリンガーを通して私が走った-そして、なぜQBはどのように私の完全な販売...の一部ではなくなった
クリス・K

いくつかのメソッドを動的に呼び出す入力をクライアントが指定できるようにしていますか?!私は言葉がありません
Mcsky

明らかに、クラスにそのような名前付きメソッドが実際に含まれていることを検証およびチェックしました。値を確認する方法はたくさんあります。それは長いswitchステートメントを打ち負かします。
スネイピー


1

クロージャを使用して、メソッドを単一の変数に格納できます。

class test{        

    function echo_this($text){
        echo $text;
    }

    function get_method($method){
        $object = $this;
        return function() use($object, $method){
            $args = func_get_args();
            return call_user_func_array(array($object, $method), $args);           
        };
    }
}

$test = new test();
$echo = $test->get_method('echo_this');
$echo('Hello');  //Output is "Hello"

編集:コードを編集しましたが、PHP5.3と互換性があります。ここに別の例

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.