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(); } }
<?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); }
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(); }
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(); } }
<?php try { $stu = make('Student', ['id' => 1, 'name' => 'li']); print_r($stu); $stu->study(); $stu->showBag(); } catch (Exception $e) { echo $e->getMessage(); }
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!