php5 具有完整的反射api,新增對類、介面、函式、方法和擴充套件進行反向工程的能力。
反射是什麼?
它是指在php執行狀態中,擴充套件分析php程式,匯出或提取出關於類、方法、屬性、引數等的詳細資訊,包括注釋。這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為反射api。反射是操縱物件導向范型中元模型的api,其功能十分強大,可幫助我們構建複雜,可擴充套件的應用。
其用途如:自動載入外掛程式,自動生成文件,甚至可用來擴充php語言。
php反射api由若干類組成,可幫助我們用來訪問程式的元資料或者同相關的注釋互動。借助反射我們可以獲取諸如類實現了那些方法,建立乙個類的例項(不同於用new建立),呼叫乙個方法(也不同於常規呼叫),傳遞引數,動態呼叫類的靜態方法。
反射api是php內建的oop技術擴充套件,包括一些類,異常和介面,綜合使用他們可用來幫助我們分析其它類,介面,方法,屬性,方法和擴充套件。這些oop擴充套件被稱為反射。
平常我們用的比較多的是reflectionclass類和reflectionmethod類,例如:
<?php
class person
public function setid($v)
public function getname()
public function setname($v)
public function getbiography()
public function setbiography($v)
}?>
一、通過reflectionclass,我們可以得到person類的以下資訊:
常量 contants
屬性 property names
方法 method names靜態
屬性 static properties
命名空間 namespace
person類是否為final或者abstract
person類是否有某個方法
接下來反射它,只要把類名"person"傳遞給reflectionclass就可以了:
$class = new reflectionclass('person');// 建立 person這個類的反射類
$instance = $class->newinstanceargs($args);// 相當於例項化person 類
1)獲取屬性(properties):
$properties = $class->getproperties();
foreach ($properties as $property)
// 輸出:
// _allowdynamicattributes
// id
// name
// biography
預設情況下,reflectionclass會獲取到所有的屬性,private 和 protected的也可以。如果只想獲取到private屬性,就要額外傳個引數:
1
$private_properties
=
$class
->getproperties(reflectionproperty::is_private);
可用引數列表:
通過$property->getname()可以得到屬性名。
2)獲取注釋:
通過getdoccomment可以得到寫給property的注釋。
3)獲取類的方法
foreach ($propertiesas $property)
} // output:
// primary_autoincrement
// varchar
// text
4)執行類的方法:
$instance->getname();// 執行person 裡的方法getname
// 或者:
$method = $class->getmethod('getname'); // 獲取person 類中的getname方法
$method->invoke($instance); // 執行getname 方法
// 或者:
$method = $class->getmethod('setname'); // 獲取person 類中的setname方法
$method->invokeargs($instance,array('snsgou.com'));
二、通過reflectionmethod,我們可以得到person類的某個方法的資訊:
是否「public」、「protected」、「private」 、「static」型別
方法的引數列表
方法的引數個數
反呼叫類的方法
// 執行detail方法
$method = new reflectionmethod('person','test');
if ($method->ispublic() && !$method->isstatic())
echo $method->getnumberofparameters();// 引數個數
echo $method->getparameters();// 引數物件陣列
php反射機制
php5新增了一項新的功能 reflection,這個功能使得phper可以reverse engineer class,inte ce,function,method and extension,通過php 就可以得到某object的所有資訊,並且可以和它互動。反射是什麼?它是指在php執行狀態中...
PHP反射機制
reflectionclass類 class a public function publicfunction private function privatefunction protected function protectedfunction test方法 public function t...
PHP的反射機制
php5新增了一項新的功能 reflection。這個功能使得phper可以reverse engineer class,inte ce,function,method and extension。通過php 就可以得到某object的所有資訊,並且可以和它互動。反射是什麼?它是指在php執行狀態中...