web-dev-qa-db-ja.com

PHPでクラスメソッドを動的に呼び出すにはどうすればよいですか?

PHPでクラスメソッドを動的に呼び出すにはどうすればよいですか?クラスメソッドは静的ではありません。どうやら

call_user_func(...)

静的関数でのみ動作しますか?

ありがとう。

50
mmattax

両方の方法で機能します-適切な構文を使用する必要があります

//  Non static call
call_user_func( array( $obj, 'method' ) );

//  Static calls
call_user_func( array( 'ClassName', 'method' ) );
call_user_func( 'ClassName::method' ); // (As of PHP 5.2.3)
89
Peter Bailey

オプション1

// invoke an instance method
$instance = new Instance();
$instanceMethod = 'bar';
$instance->$instanceMethod();

// invoke a static method
$class = 'NameOfTheClass';
$staticMethod = 'blah';
$class::$staticMethod();

オプション2

// invoke an instance method
$instance = new Instance();
call_user_func( array( $instance, 'method' ) );

// invoke a static method
$class = 'NameOfTheClass';
call_user_func( array( $class, 'nameOfStaticMethod' ) );
call_user_func( 'NameOfTheClass::nameOfStaticMethod' ); // (As of PHP 5.2.3)

オプション1はオプション2よりも高速であるため、メソッドに渡す引数の数がわからない限り、オプションを使用してください。


編集:前のエディターは私の答えをきれいにするのに非常に役立ちましたが、call_user_funcとは異なるcall_user_func_arrayの言及を削除しました。

PHPには

mixed call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] ) 

http://php.net/manual/en/function.call-user-func.php

そして

mixed call_user_func_array ( callable $callback , array $param_arr )

http://php.net/manual/en/function.call-user-func-array.php

Call_user_func_arrayの使用は、上記のいずれかのオプションの使用よりも桁違いに遅くなります。

23
David

こういう意味?

<?php

class A {
    function test() {
        print 'test';
    }
}

$function = 'test';

// method 1
A::$function();

// method 2
$a = new A;    
$a->$function();

?>
16
Jeremy Ruten
call_user_func(array($object, 'methodName'));

詳細については、 phpコールバックドキュメント を参照してください。

2
Neil Williams

編集:私はあなたが尋ねようとしていたものを解決した...ああまあ..とにかく私のコメントを残します。必要に応じて、クラスとメソッドの名前を変数で置き換えることができます。(しかし、あなたはクレイジーです)-ニックネーム


クラス内から関数を呼び出すには、次の2つの方法のいずれかを実行できます。

クラスのインスタンスを作成してから呼び出すことができます。例えば。:

$bla = new Blahh_class();
$bla->do_something();

または...関数を静的に呼び出すことができます。つまり、クラスのインスタンスなしで。例えば。:

Blahh_class::do_something()

もちろん、関数が静的であることを宣言する必要があります。

class Blahh_class {   
    public static function do_something(){
        echo 'I am doing something';
    }
}

クラスが静的として定義されていない場合は、オブジェクトのインスタンスを作成する必要があります。そのため、オブジェクトにはコンストラクタが必要です。

class Blahh_class {
    $some_value;

    public function __construct($data) {
        $this->$some_value = $data;
    }

    public function do_something() {
         echo $this->some_value;
    }
}

覚えておくべき重要なことは、静的クラス関数は$thisクラスのインスタンスがないため。 (これは、それらがずっと速くなる理由の1つです。)

1
Bingy

PHP7以降、配列のような方法を使用します。

// Static call only
[TestClass::class, $methodName](...$args);

// Dynamic call, static or non-static doesn't matter
$instance = new TestClass;
[$instance, $methodName](...$args);

クラス名をTestClassに、メソッド名を$methodNameに、メソッド引数を...$argsに置き換えるだけです。後者の場合、メソッドが静的であっても非静的であっても問題ないことに注意してください。 PHPは自動的に呼び出します。

0
MAChitgarha

私が見つける最善の方法は

call_user_func_array(array(__NAMESPACE__ .'\Foo', 'test'), array('Philip'));

それは魅力のように働いています!

0
Osin Toumani

これは代替として有用かもしれません

class ReferenceContainer {

    function __construct(CallbackContainer $callbackContainer) {

        //Alternatively you can have no parameters in this constructor and create a new instance of CallbackContainer and invoke the callback in the same manner        
        //var_dump($this->callbackContainer);
        $data = 'This is how you parse a class by reference';
        $callbackContainer->myCallback($data);

    }

}

class CallbackContainer {

    function __construct() {}

    function myCallback($data) {

        echo $data."\n";

    }

}

$callbackContainer = new CallbackContainer();
$doItContainer = new ReferenceContainer($callbackContainer);
0
user2288580
Class Foo{
 public function show(){
  echo 'I am in Foo Class show method';
 }

}

call_user_func(array('Foo', 'show'));

$classname = new Foo;
call_user_func(array($classname, 'show'));
call_user_func($classname .'::show'); // As of 5.2.3

$foo = new Foo();    
call_user_func(array($foo, 'show'));
0
Nanhe Kumar