介紹:
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 方法