2008-11-07 4 views

ответ

80

Он работает в обоих направлениях - вы должны использовать правильный синтаксис

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

и эти: http://stackoverflow.com/questions/251485/dynamic-class-method-invocation-in-php – 2014-05-03 20:40:59

16

Вы имеете в виду, как это?

<?php 

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

$function = 'test'; 

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

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

?> 
16

Вариант 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, чтобы попытаться использовать их, если вы не знаете, сколько аргументов ваш будет переходя к методу.


Edit: Предыдущий редактор сделал большую работу по очистке моего ответа, но удалил упоминание о call_user_func_array, которая отличается тем call_user_func.

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 на несколько порядков медленнее, используя любой из вариантов, перечисленных выше.

1

EDIT: Я только что разработал то, что вы пытались спросить ... ах хорошо .. оставит мои комментарии в любом случае. Вы можете заменить имена классов и методов с переменными, если вы хотите .. (но вы с ума) - ник


Чтобы вызвать функцию из класса Вы можете сделать это одним из двух способов ...

Либо вы можете создать экземпляр класса, а затем вызвать его. .: например

$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, поскольку нет ни одного случая из CLAS s. (Это одна из причин, почему они идут гораздо быстрее.)

0

лучший способ я нашел, чтобы сделать

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

Это работает как шарм!

0
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

Это может быть полезно в качестве замены

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); 
Смежные вопросы