2008-11-07 10 views

Antwort

80

Es funktioniert in beide Richtungen - Sie rechts die Syntax

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

Und diese: http://stackoverflow.com/questions/251485/dynamic-class-method-invocation-in-php –

16

Sie mögen dies bedeuten, verwenden?

<?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 ist schneller als Option 2 so versuchen, sie zu verwenden, wenn Sie nicht wissen, wie viele Argumente Ihr sein Übergabe an die Methode.


Edit: Vorherige Editor hat gute Arbeit geleistet, meine Antwort der Reinigung aber erwähnt call_user_func_array entfernt, die dann call_user_func unterscheidet.

PHP hat

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

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

UND

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 Verwendung ist um Größenordnungen langsamer als oben aufgeführten entweder Option.

1

EDIT: Ich habe gerade ausgearbeitet, was Sie zu fragen versuchten ... ah gut .. wird meine Kommentare sowieso verlassen. Sie können Namen von Klassen und Methoden mit Variablen ersetzen, wenn Sie gerne .. (aber Sie sind verrückt) - nick


Um eine Funktion aus innerhalb einer Klasse nennen Sie es eine von zwei Arten tun kann ...

Entweder Sie können eine Instanz der Klasse erstellen und sie dann aufrufen. z.B .:

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

oder ... können Sie die Funktion statisch nennen .. das heißt ohne Instanz der Klasse. z.B.:

Blahh_class::do_something() 

natürlich brauchen Sie zu erklären, dass Ihre Funktion statisch ist:

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

Wenn eine Klasse nicht als statisch definiert ist, dann müssen Sie eine Instanz des Objekts erstellen .. (so das Objekt muss einen Konstruktor) zB:

class Blahh_class { 
    $some_value; 

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

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

die wichtige Sache zu erinnern ist, dass statische Klasse Funktionen nicht $this verwenden können, da es keine Instanz des cla ist s. (Dies ist einer der Gründe, warum sie viel schneller gehen.)

0

die beste Weise, die wir finden tun

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

Es ist wie ein Zauber funktioniert!

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

Dies als Ersatz nützlich sein können

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); 
Verwandte Themen