2008-11-07 10 views

Répondre

80

Il fonctionne dans les deux sens - vous devez utiliser la bonne syntaxe

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

Et ceux-ci: http://stackoverflow.com/questions/251485/dynamic-class-method-invocation-in-php –

16

Vous voulez dire comme ça?

<?php 

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

$function = 'test'; 

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

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

?> 
16

Option 1

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

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

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

Option 1 est plus rapide que l'option 2, alors essayez de les utiliser à moins que vous ne savez pas combien d'arguments vous allez être passer à la méthode.


Edit: éditeur précédent a fait du bon travail de nettoyage ma réponse, mais retirée mention call_user_func_array qui est différent alors call_user_func.

PHP a

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

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

ET

mixed call_user_func_array (callable $callback , array $param_arr) 

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

qu'utiliser call_user_func_array ordres de grandeur plus lente puis en utilisant l'une des options ci-dessus.

1

EDIT: Je viens de mettre au point ce que vous essayiez de demander ... ah eh bien ... laisserai mes commentaires de toute façon. Vous pouvez remplacer les noms des classes et des méthodes avec des variables si vous voulez .. (mais vous êtes fou) - nick


Pour appeler une fonction à partir d'une classe, vous pouvez le faire de deux façons ...

Soit vous pouvez créer une instance de la classe, puis l'appeler. .: par exemple

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

ou ... vous pouvez appeler la fonction statique .. dire sans instance de la classe. par exemple.:

Blahh_class::do_something() 

Bien sûr, vous ne devez déclarer que votre fonction est statique:

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

Si une classe est pas définie comme statique, vous devez créer une instance de l'objet .. (donc l'objet a besoin d'un constructeur) par exemple:

class Blahh_class { 
    $some_value; 

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

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

la chose importante à retenir est que les fonctions statiques de classe ne peuvent pas utiliser $this car il n'y a pas d'exemple des clas s. (Ce qui est l'une des raisons pour lesquelles ils vont beaucoup plus vite.)

0

La meilleure façon de trouver est de faire

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

Il fonctionne comme un charme!

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

Cela peut être utile en tant que substitut

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); 
Questions connexes