Nasıl dinamik olarak PHP bir sınıf yöntemi çağırmak mı?

6 Cevap php

Nasıl dinamik olarak PHP bir sınıf yöntemi çağırabilirsiniz? Sınıf yöntemi statik değildir. Öyle görünüyor ki

call_user_func(...)

Sadece statik fonksiyonları ile çalışır?

Teşekkürler.

6 Cevap

Bu iki şekilde çalışır - Eğer doğru sözdizimi kullanmanız gerekir

//  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)

Yani böyle mi?

<?php

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

$function = 'test';

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

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

?>

Seçenek 1

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

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

Seçenek 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)

Seçenek 1 is faster than Seçenek 2 so try to use them unless you don't know how many arguments your going to be passing to the method.


Düzenleme: Önceki editör benim cevap temizleme büyük bir iş yaptım ama sonra call_user_func farklı call_user_func_array bahsedilmektedir kaldırıldı.

PHP vardır

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

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

VE

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 kullanarak yukarıda listelenen seçeneğini kullanarak yavaş o büyüklükte emir.

call_user_func(array($object, 'methodName'));

Daha fazla ayrıntı için bkz: php callback documentation.

EDIT: Ben sadece iyi ah .. zaten benim yorum bırakacak ... sormaya çalışıyor ne çalıştı. Eğer .. gibi (ama sen delirdin mi) eğer sınıfları ve değişkenleri ile yöntemlerin isimleri yerini alabilir - nick


Bir işlevi çağırmak için bir sınıf içinde bunu iki yoldan birini yapabilirsiniz ...

Either you can create an instance of the class, and then call it. e.g.:

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

or... you can call the function statically.. i.e. with no instance of the class. e.g.:

Blahh_class::do_something()

tabii sizin işlevi statik olduğunu beyan etmek gerekiyor:

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

If a class is not defined as static, then you must create an instance of the object.. (so the object needs a constructor) e.g.:

class Blahh_class {
    $some_value;

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

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

Hatırlanması gereken önemli şey sınıfının hiçbir örneği yok gibi statik sınıfı işlevleri $this kullanamazsınız olmasıdır. (Bu onlar çok daha hızlı gitmek nedenlerinden biridir.)

I bulmak en iyi yolu yapmaktır

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

Bu bir cazibe gibi çalışıyor!