Kürzlich habe ich Java-Programmierideen gelesen und das Kapitel über Typinformationen gesehen, in dem es um Klasseninformationen und das Konzept der Reflexion ging. Sehen wir uns übrigens die Reflexionstools von PHP an. Im Handbuch heißt es: „PHP 5 verfügt über eine vollständige Reflection-API, die die Möglichkeit bietet, Klassen, Schnittstellen, Funktionen, Methoden und Erweiterungen zurückzuentwickeln. Darüber hinaus bietet die Reflection-API Methoden zum Herausnehmen von Funktionen, Klassen und Methoden.“ Dokumentationskommentar. „Natürlich ist das Handbuch etwas abstrakt!“ Das sogenannte Reverse Engineering bedeutet, dass Sie detaillierte Informationen zu Klassen, Methoden, Attributen, Parametern usw. erhalten können, einschließlich Kommentaren. Der Text ist beispielsweise immer so langweilig Wert einer bestimmten Klasse. Verwandte Informationen, wie Eigenschaften, Methoden, Namespaces, welche Schnittstellen implementiert sind usw.! Im vorherigen Beispiel hat ReflectionClass::getProperties ein Array von ReflectionProperty-Objekten zurückgegeben.
class Foo { public $foo = 1; protected $bar = 2; private $baz = 3; /** * Enter description here ... */ public function myMethod() { echo 'hello 2b'; } } $ref = new ReflectionClass('Foo'); $props = $ref->getProperties(); foreach ($props as $value) { echo $value->getName()."\n"; } //output //foo //bar //baz
ReflectionClass::getMethod ist ein ReflectionMethod-Typ. Die ReflectionMethod-Klasse meldet Informationen über a Methode, wie isAbstract isPrivate isProtected isPublic isStatic isConstructor, es gibt auch eine wichtige Methode Invoke, InvokeArgs ist die Ausführungsmethode!
class Foo { public $foo = 1; protected $bar = 2; private $baz = 3; /** * Enter description here ... */ public function myMethod() { echo 'hello 2b'; } } $ref = new ReflectionClass('Foo'); $method = $ref->getMethod('myMethod'); $method->invoke($ref->newInstance());
Der obige Code zeigt deutlich den Prozess dieses Frameworks! Über den Router verarbeiten Sie tatsächlich die URL-Klasse. Über den Router können Sie ermitteln, welcher Controller und welche Methode verwendet wird. Dann führen Sie die Methode aus!
// Start validation of the controller $class = new ReflectionClass(ucfirst(Router::$controller).'_Controller'); // Create a new controller instance $controller = $class->newInstance(); // Load the controller method $method = $class->getMethod(Router::$method); // Execute the controller method $method->invokeArgs($controller, $arguments);