58

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

call_user_func(...)

静的関数でのみ機能しますか?

ありがとう。

4

7 に答える 7

99

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

//  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)
于 2008-11-07T18:53:18.797 に答える
29

オプション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 を使用すると、上記のいずれかのオプションを使用するよりも桁違いに遅くなります。

于 2008-11-07T22:59:13.183 に答える
17

こんな感じですか?

<?php

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

$function = 'test';

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

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

?>
于 2008-11-07T18:54:57.717 に答える
2
call_user_func(array($object, 'methodName'));

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

于 2008-11-07T18:53:04.493 に答える
1

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


クラス内から関数を呼び出すには、次の 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つです。)

于 2008-11-10T02:27:22.420 に答える