天天看點

PHP的反射機制 介紹: 例子

介紹:

PHP5添加了一項新的功能:Reflection。這個功能使得phper可以reverse-engineer class, interface,function,method and extension。通過PHP代碼,就可以得到某object的所有資訊,并且可以和它互動。

反射是什麼?

它是指在PHP運作狀态中,擴充分析PHP程式,導出或提取出關于類、方法、屬性、參數等的詳細資訊,包括注釋。這種動态擷取的資訊以及動态調用對象的方法的功能稱為反射API。反射是操縱面向對象範型中元模型的API,其功能十分強大,可幫助我們建構複雜,可擴充的應用。

其用途如:自動加載插件,自動生成文檔,甚至可用來擴充PHP語言。

php反射api由若幹類組成,可幫助我們用來通路程式的中繼資料或者同相關的注釋互動。借助反射我們可以擷取諸如類實作了那些方法,建立一個類的執行個體(不同于用new建立),調用一個方法(也不同于正常調用),傳遞參數,動态調用類的靜态方法。

      反射api是php内建的oop技術擴充,包括一些類,異常和接口,綜合使用他們可用來幫助我們分析其它類,接口,方法,屬性,方法和擴充。這些oop擴充被稱為反射。

      通過ReflectionClass,我們可以得到Person類的以下資訊:

     1)常量 Contants

     2)屬性 Property Names

     3)方法 Method Names靜态

     4)屬性 Static Properties

     5)命名空間 Namespace

     6)Person類是否為final或者abstract

例子

<?php

class Person {  
  
    private $_allowDynamicAttributes = false;
 
    /** type=primary_autoincrement */
    protected $id = 0;
    
    /** type=varchar  */
    protected $name;
 
    protected $biography;
    
    public function __construct()
    {
        echo 'construct';
    }
 
    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;
    }
    
    public function test()
    {
        echo 'test function';
    }
}


$class = new ReflectionClass('Person');//建立 Person這個類的反射類
$instance  = $class->newInstanceArgs();//相當于執行個體化Person 類

echo '<br>';

//擷取屬性(Properties):
$properties = $class->getProperties();
foreach($properties as $property) {
    echo $property->getName();
    echo '<br>';
}

//擷取注釋:
foreach($properties as $property) {
    if($property->isProtected()) {
        $docblock = $property->getDocComment();
        preg_match('/ type\=([a-z_]*) /', $property->getDocComment(), $matches);
        var_dump($matches)."<br>";
    }
}

//執行類的方法:
$instance->test(); //執行Person 裡的方法test
//或者:
$ec=$class->getmethod('test');  //擷取Person 類中的test方法
$ec->invoke($instance);       //執行test 方法
           
php
上一篇: Cow and Snacks
下一篇: php反射函數