PHP 5 具有完整的反射 API,添加了对类、接口、函数、方法和扩展进行反向工程的能力。 此外,反射 API 提供了方法来取出函数、类和方法中的文档注释。
反射是指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取的信息以及动态调用对象的方法的功能称为反射API。反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复杂,可扩展的应用。
其用途如:自动加载插件,自动生成文档,甚至可用来扩充PHP语言。
<?php
class Apple {
public function firstMethod() { echo 'first'; }
final protected function secondMethod() { }
private static function thirdMethod() { }
}
//定义了一个反射类
$clsw = new ReflectionClass('Apple');
//创建一个实例
$cls = $clsw->newInstance();
//获取反射的类方法
$methods = $clsw->getMethod('firstMethod');
//调用方法
$methods->invoke($cls);
<?php
class A
{
public $one = '';
public $two = '';
//Constructor
public function __construct()
{
//Constructor
}
//print variable one
public function echoOne()
{
echo $this->one."\n";
}
//print variable two
public function echoTwo()
{
echo $this->two."\n";
}
}
//Instantiate the object
$a = new A();
//实例化一个反射类
$reflector = new ReflectionClass('A');
//获得属性
$properties = $reflector->getProperties();
$i =1;
//Now go through the $properties array and populate each property
foreach($properties as $property)
{
//$a->one = 1;
$a->{$property->getName()}=$i;
//$a->echoOne();
$a->{"echo".ucfirst($property->getName())}()."\n";
$i++;
}
//输出 1,2
?>
<?php
interface IPlugin
{
public static function getName();
}
class Plugin implements IPlugin
{
public static function getName()
{
return 'Plugin';
}
public static function getItems()
{
return array(
array(
'title'=>'reflection'
)
);
}
}
function findPlugins()
{
$plugins = array();
foreach(get_declared_classes() as $class){
$reflectionClass = new ReflectionClass($class);
if($reflectionClass->implementsInterface('IPlugin')){
$plugins[] = $reflectionClass;
}
}
return $plugins;
}
function Items()
{
$items = array();
foreach(findPlugins() as $plugin){
if($plugin->hasMethod('getItems')){
$reflectionMethod = $plugin->getMethod('getItems');
if($reflectionMethod->isStatic()){
$item = $reflectionMethod->invoke(null);
}else{
$pluginInstance = $plugin->newInstance();
$item = $pluginInstance->invoke();
}
}
$items = array_merge($items, $item);
}
return $items;
}
$item = Items();
print_r($item);