In diesem Artikel wird hauptsächlichBeispieleinführungDer Reflection-Reflexionsmechanismus von PHP aus der Perspektive der Verwendung von Reflection vorgestellt, um Informationen über eine Klasse zu erhalten.
PHP5 fügt eine neue Funktion hinzu: Reflection. Mit dieser Funktion können Programmierer Klassen, Schnittstellen, Funktionen, Methoden und Erweiterungen rückentwickeln. Durch PHP-Code können Sie alle Informationen eines Objekts abrufen und mit ihm interagieren.
Angenommen, es gibt eine Klasse Person:
Der Code lautet wie folgt:
class Person { /** * For the sake of demonstration, we"re setting this private */ private $_allowDynamicAttributes = false; /** type=primary_autoincrement */ protected $id = 0; /** type=varchar length=255 null */ protected $name; /** type=text null */ protected $biography; public function getId() { return $this->id; } public function setId($v) { $this->id = $v; } public function getName() { return $this->name; } public function setName($v) { $this->name = $v; } public function getBiography() { return $this->biography; } public function setBiography($v) { $this->biography = $v; } }
Über ReflectionClass können wir die folgenden Informationen der Personenklasse erhalten:
1. Konstanten
2.Eigenschaftsnamen
3.Methodennamen
4.Statische Eigenschaften
5.NamespaceNamespace
6.Ob die Personenklasse endgültig ist oder Zusammenfassung
Übergeben Sie einfach den Klassennamen „Person“ an ReflectionClass:
Der Code lautet wie folgt:
$class = new ReflectionClass('Person');
Get the Attribute (Eigenschaften):
Der Code lautet wie folgt:
$properties = $class->getProperties(); foreach ($properties as $property) { echo $property->getName()."\n"; } // 输出: // _allowDynamicAttributes // id // name // biography
Standardmäßig erhält ReflectionClass alle Eigenschaften, einschließlich privater und geschützter Eigenschaften. Wenn Sie nur das private Attribut erhalten möchten, müssen Sie einen zusätzlichen Parameter übergeben:
Der Code lautet wie folgt:
$private_properties = $class->getProperties(ReflectionProperty::IS_PRIVATE);
Verfügbare Parameterliste:
Code wie folgt:
ReflectionProperty::IS_STATIC ReflectionProperty::IS_PUBLIC ReflectionProperty::IS_PROTECTED ReflectionProperty::IS_PRIVATE
Wenn Sie sowohl öffentliche als auch private Eigenschaften erhalten möchten, schreiben Sie einfach so: ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED
Das sollte nicht der Fall sein fühle mich seltsam.
Der Eigenschaftsname kann über $property->getName() abgerufen werden, und der in die Eigenschaft geschriebene Kommentar kann über getDocComment abgerufen werden.
Der Code lautet wie folgt:
foreach($properties as $property) { if($property->isProtected()) { $docblock = $property->getDocComment(); preg_match('/ type\=([a-z_]*) /', $property->getDocComment(), $matches); echo $matches[1]."\n"; } } // Output: // primary_autoincrement // varchar // text
Es ist ein bisschen unglaublich. Sie können sogar Kommentare erhalten.
Methoden abrufen: Alle Methoden der Klasse über getMethods() abrufen. Zurückgegeben wird ein Array von ReflectionMethod-Objekten. Keine Demonstrationen mehr.
Zum Schluss rufen Sie die Methode in der Klasse über ReflectionMethod auf.
Der Code lautet wie folgt:
$data = array("id" => 1, "name" => "Chris", "biography" => "I am am a PHP developer"); foreach($data as $key => $value) { if(!$class->hasProperty($key)) { throw new Exception ($key." is not a valid property"); } if(!$class->hasMethod("get". ucfirst ($key))) { throw new Exception($key." is missing a getter"); } if(!$class->hasMethod("set".ucfirst($key))) { throw new Exception($key." is missing a setter"); } // Make a new object to interact with $object = new Person(); // Get the getter method and invoke it with the value in our data array $setter = $class->getMethod("set".ucfirst($key)); $ok = $setter->invoke($object, $value); // Get the setter method and invoke it $setter = $class->getMethod("get".ucfirst($key)); $objValue = $setter->invoke($object); // Now compare if($value == $objValue) { echo "Getter or Setter has modified the data.\n"; } else { echo "Getter and Setter does not modify the data.\n"; } }
Das obige ist der detaillierte Inhalt vonWie wird der Reflection-Reflexionsmechanismus in PHP implementiert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!