Heim  >  Artikel  >  Backend-Entwicklung  >  Einführung in den Reflection-Reflexionsmechanismus von PHP

Einführung in den Reflection-Reflexionsmechanismus von PHP

不言
不言Original
2018-07-05 15:59:571265Durchsuche

Dieser Artikel stellt hauptsächlich den Reflexionsmechanismus von PHP vor. Er hat einen gewissen Referenzwert. Jetzt können Freunde in Not darauf verweisen.

PHP5 fügt hinzu eine neue Funktion: Reflexion. Mit dieser Funktion können Programmierer

Klassen, Schnittstellen, Funktionen, Methoden und Erweiterungen zurückentwickeln [Unterstützung für Erweiterungsbibliotheken].

Durch PHP-Code können Sie alle Informationen eines Objekts abrufen und mit ihm interagieren.

Nehmen Sie die folgende Personenklasse an:

 1 class Person { 
 2     /** 
 3      * For the sake of demonstration, we"re setting this private 
 4      */ 
 5     private $_allowDynamicAttributes = false; 
 6      
 7     /** 
 8      * type=primary_autoincrement 
 9      */
 10     protected $id = 0;
 11     
 12     /**
 13      * type=varchar length=255 null
 14      */
 15     protected $name;
 16     
 17     /**
 18      * type=text null19      */
 20     protected $biography;
 21     public function getId() {
 22         return $this->id;
 23     }
 24     public function setId($v) {
 25         $this->id = $v;
 26     }
 27     public function getName() {
 28         return $this->name;
 29     }
 30     public function setName($v) {
 31         $this->name = $v;
 32     }
 33     public function getBiography() {
 34         return $this->biography;
 35     }
 36     public function setBiography($v) {
 37         $this->biography = $v;
 38     }
 39 }

Über ReflectionClass können wir die folgenden Informationen der Personenklasse erhalten:

  • Konstanten

  • Eigenschaftsnamen

  • Methodennamen

  • Statische EigenschaftenStatische Eigenschaften

  • Namespace Namespace

  • Ob die Person-Klasse endgültig oder abstrakt ist

Übergeben Sie einfach den Klassennamen „Person“ an ReflectionClass:

1 $class = new ReflectionClass('Person');

* Eigenschaften abrufen (Eigenschaften):

1 $properties = $class->getProperties();2 foreach($properties as $property) {
3     echo $property->getName()."\n";4 }
5 // 输出:6 // _allowDynamicAttributes7 // id8 // name9 // biography

Standardmäßig ruft ReflectionClass alle Eigenschaften ab, einschließlich privater und geschützter. Wenn Sie nur das private Attribut erhalten möchten, müssen Sie einen zusätzlichen Parameter übergeben:

1 $private_properties = $class->getProperties(ReflectionProperty::IS_PRIVATE);

Verfügbare Parameterliste:

  • ReflectionProperty::IS_STATIC

  • ReflectionProperty::IS_PUBLIC

  • ReflectionProperty::IS_PROTECTED

  • ReflectionProperty::IS_PRIVATE

Wenn Sie sowohl öffentliche als auch private Eigenschaften gleichzeitig erhalten möchten, schreiben Sie einfach so: ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED

Sie können den Eigenschaftsnamen über $property- erhalten. >getName(), und Sie können es über getDocComment-Eigenschaftskommentare abrufen.

 1 foreach($properties as $property) {
 2     if($property->isProtected()) { 
 3         $docblock = $property->getDocComment(); 
 4         preg_match('/ type\=([a-z_]*) /', $property->getDocComment(), $matches); 
 5         echo $matches[1]."\n"; 
 6     } 
 7 } 
 8 // Output: 
 9 // primary_autoincrement
 10 // varchar
 11 // 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.

* Rufen Sie abschließend die Methode in der Klasse über ReflectionMethod auf.

$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 gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.

Verwandte Empfehlungen:

So crawlen Sie Webinhalte und Bilder mit PHP

PHP-Import-Fortschrittsbalkenklasse

PHP-Bereich

Das obige ist der detaillierte Inhalt vonEinführung in den Reflection-Reflexionsmechanismus von PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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