Heim >Backend-Entwicklung >PHP-Tutorial >Ein direkter Blick auf das PHP-Reflexionslernen zur Instanziierung von Klassenoperationen ohne Verwendung der neuen Methode
Das Beispiel in diesem Artikel beschreibt die Verwendung von PHP-Reflexionslernen, um Klassenoperationen ohne die neue Methode zu instanziieren. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:
Im vorherigen Artikel zum Beispiel „Erste Schritte mit PHP Reflection“ wurde kurz die Verwendung mehrerer gängiger Klassen von PHP Reflection vorgestellt, aber Sie können sich das vielleicht immer noch nicht vorstellen Was Sie mit Reflection machen können.
Als nächstes werde ich die Reflection-Klasse verwenden, um etwas zu tun. Ist es in Ordnung, eine Klasse zu instanziieren? ? Die Antwort lautet: Ja, dies kann durch Reflexion erreicht werden: new
Verwandte Lernempfehlungen:Erstellen Sie zunächst eine Datei student .php:
<?php class Student { public $id; public $name; public function __construct($id,$name) { $this->id = $id; $this->name = $name; } public function study() { echo $this->name.' is learning.....'.PHP_EOL; } public function showBag(){ echo "My bag have ".$this->bag->all(); } }Erstellen Sie eine neue Datei run.php
<?php require 'student.php'; function make($class, $vars = []) { $ref = new ReflectionClass($class); if(!$ref->isInstantiable()) { throw new Exception("类{$class} 不存在"); } $constructor = $ref->getConstructor(); if(is_null($constructor)) { return new $class; } $params = $constructor->getParameters(); $resolveParams = []; foreach ($params as $key=>$value) { $name = $value->getName(); if(isset($vars[$name])) { $resolveParams[] = $vars[$name]; } else { $default = $value->isDefaultValueAvailable() ? $value->getDefaultValue() : null; if(is_null($default)) { if($value->getClass()) { $resolveParams[] = make($value->getClass()->getName(), $vars); } else { throw new Exception("{$name} 没有传值且没有默认值。"); } } else { $resolveParams[] = $default; } } } return $ref->newInstanceArgs($resolveParams); }run.php. Die Funktion „make“ ist die Funktion, die wir schreiben, um die Klasse zu instanziieren Name, der zweite Parameter sind die Parameterdaten, die an den Konstruktor der Klasse übergeben werden müssen. Abhängig von den Parametern des Student-Konstruktors gibt es mehrere Situationen: (Fügen Sie den folgenden Code je nach Situation an run.php an.)
Fall 1: $ ist nicht vorhanden bereitgestellt Der Wert von name
try { $stu = make('Student', ['id' => 1]); print_r($stu); $stu->study(); } catch (Exception $e) { echo $e->getMessage(); }Wenn $name keinen Standardwert im Konstruktor hat, wird ein Fehler gemeldet. Sie können die Student-Klasse leicht ändern, um einen Standardwert für $name bereitzustellen. und dann wird es nicht. Es wurde ein Fehler gemeldet.
Fall 2 liefert den Wert von $name
try { $stu = make('Student', ['id' => 1, 'name' => 'li']); print_r($stu); $stu->study(); } catch (Exception $e) { echo $e->getMessage(); }
Fall 3, ändern wir student.php
<?php class Bag{ public function name(){ return "学生包".PHP_EOL; } } class Student { public $id; public $name; public function __construct($id, $name="xxx", Bag $bag) { $this->id = $id; $this->name = $name; $this->bag = $bag; } public function study() { echo $this->name.' is learning.....'.PHP_EOL; } public function showBag(){ echo "My bag is ".$this->bag->name(); } }Wie Sie Wie Sie sehen, wird der Student-Klasse ein Parameter $bag hinzugefügt. Der Typ ist Bag. Führen Sie nun
<?php try { $stu = make('Student', ['id' => 1, 'name' => 'li']); print_r($stu); $stu->study(); $stu->showBag(); } catch (Exception $e) { echo $e->getMessage(); }aus und Sie können sehen, dass der dritte Parameter $bag des Konstruktors automatisch instanziiert wird . und dann an den Konstruktor der Student-Klasse übergeben. Dieser Teil kann zum Implementieren der Abhängigkeitsinjektion verwendet werden. Wir können das Objekt nicht automatisch instanziieren Klasse des Parameters. Dadurch wird eine Entkopplung zwischen den Klassen erreicht. Wenn Sie Laravel gelernt haben, sollten Sie damit vertraut sein.
Das obige ist der detaillierte Inhalt vonEin direkter Blick auf das PHP-Reflexionslernen zur Instanziierung von Klassenoperationen ohne Verwendung der neuen Methode. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!