Heim > Backend-Entwicklung > PHP-Tutorial > Wie wird der Reflection-Reflexionsmechanismus in PHP implementiert?

Wie wird der Reflection-Reflexionsmechanismus in PHP implementiert?

伊谢尔伦
Freigeben: 2023-03-12 09:38:01
Original
1042 Leute haben es durchsucht

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;
        }
}
Nach dem Login kopieren

Ü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');
Nach dem Login kopieren

Get the Attribute (Eigenschaften):

Der Code lautet wie folgt:

$properties = $class->getProperties();
foreach
($properties as $property) {
    echo $property->getName()."\n";
}
// 输出:
// _allowDynamicAttributes
// id
// name
// biography
Nach dem Login kopieren

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);
Nach dem Login kopieren

Verfügbare Parameterliste:

Code wie folgt:

ReflectionProperty::IS_STATIC
ReflectionProperty::IS_PUBLIC
ReflectionProperty::IS_PROTECTED
ReflectionProperty::IS_PRIVATE
Nach dem Login kopieren

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
Nach dem Login kopieren

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";
   }
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage