web-dev-qa-db-de.com

OOP in PHP: Klassenfunktion aus einer Variablen?

Ist es möglich, Funktionen aus einer Klasse wie dieser aufzurufen:

$class = new class;
$function_name = "do_the_thing";
$req = $class->$function_name();

Etwas ähnliches, scheint dies nicht zu funktionieren?

26
Martti Laine

Ja, es ist möglich, das heißt als variable Funktionen, einen SIEHE DAZU. Zu haben.

Beispiel von der offiziellen PHP-Seite:

<?php
class Foo
{
    function Variable()
    {
        $name = 'Bar';
        $this->$name(); // This calls the Bar() method
    }

    function Bar()
    {
        echo "This is Bar";
    }
}

$foo = new Foo();
$funcname = "Variable";
$foo->$funcname();  // This calls $foo->Variable()

?>

Stellen Sie in Ihrem Fall sicher, dass die Funktion do_the_thing vorhanden ist. Beachten Sie auch, dass Sie den Rückgabewert der Funktion speichern:

$req = $class->$function_name();

Versuchen Sie herauszufinden, was die Variable $req enthält. Zum Beispiel sollte dies Ihnen Informationen geben:

print_r($req); // or simple echo as per return value of your function

Hinweis:

Variablenfunktionen funktionieren nicht mit Sprachkonstrukten wie echo(), print(), unset(), isset(), empty(), include(), require() und dergleichen. Verwenden Sie Wrapper-Funktionen, um eines dieser Konstrukte als variable Funktionen zu verwenden.

55
Sarfraz

Mein einfachstes Beispiel ist:

$class = new class;
$function_name = "do_the_thing";
$req = $class->${$function_name}();

$ {$ Funktionsname} ist der Trick

Funktioniert auch mit statischen Methoden:

$req = $class::{$function_name}();
6
Tudor

Sie können ReflectionClass verwenden.

Beispiel:

$functionName = 'myMethod';
$myClass = new MyClass();
$reflectionMyMethod = (new ReflectionClass($myClass))->getMethod($functionName);

$relectionMyMethod->invoke($myClass); // same as $myClass->myMethod();

Denken Sie daran, ReflectionException abzufangen, wenn die Methode nicht vorhanden ist.

0
user2986600