haoli 发表于 2015-8-28 07:50:16

PHP 反射 初步测试

<?php
//php反射机制
/*
//用途 1 该扩展分析php程序,导出或提取出关于类,方法,属性,参数等详细信息,包括注释
//Reflection可以说是对php库函数: /classes/objects类/对象函数的一个扩展
//主要用在通过程序检测现有的php程序内部关于类,方法等信息,并做出处理
class testClass
{
public function testFunc($param1, $param2=0)
{
}
}
//reflectionMethod 反射类,该类报告了一个访法的有关信息
$method = new ReflectionMethod('testClass','testFunc');
$params = $method->getParameters();
foreach ($params as $param)
{
echo "param name:".$param->getName()."<BR><BR>";
if($param->isOptional())
{
echo "Default value:".$param->getDefaultValue()."<BR><BR>";
}
if($param->allowsNull() ===true)
{
echo "可以为空";
}else{
echo "不能为空";
}
echo "<BR>=================<BR>";
}
*/
//Reflection::export(new ReflectionExtension('reflection'));
//打印出reflection api实例的每一个类,方法和参数细节
//我们通过Reflection的export()方法实现这种输出
//get_declared_classes() 返回每一个内建的php类包括系统类库
/*foreach (get_declared_classes() as $class)
{
$reflectionClass = Reflection::export(new ReflectionClass($class));
//echo "<BR><BR>============================<BR>";
if($reflectionClass->isUserDefined()===true) //用户自定义的类
{
Reflection::export($reflectionClass);
echo "<BR><BR>============================<BR>";
}
}*/
/*class ClassOne
{
public function callClassOne($arr)
{
print "In Class One, str:<B>{$arr}</B>";
}
}
class ClassOneDelegator
{
private $targets;
function __construct()
{
$this->targets[] = new ClassOne();
}
//__call()函数在一个对象的上下文中,如果调用的方法不存在的时候,它被触发
function __call($name, $args)
{
//echo $name."<BR><BR>";
//var_dump($args);
foreach($this->targets as $obj)
{
$r = new ReflectionClass($obj); //取得该类的详细信息
//var_dump($r->getMethod($name));
if($method =$r->getMethod($name)) //获取该类是否有$name这个方法
{
//方法为公有,并且测试该类是否为抽象类
if($method->isPublic() && !$method->isAbstract())
{
return $method->invoke($obj,$args);
//invoke 调用该方法
}
}
}
}
}
$obj = new ClassOneDelegator();
$str = 'I love You';
$obj->callClassOne($str);*/

//PHP反射 API--利用反射 技术实现的插件系统架构
interface Iplugin
{
public static function getName();
}
//查询插件函数
function findPlugins()
{
$plugins = array();
foreach (get_declared_classes() as $class) { //获取所有已经加载的类
$reflectionClass = new ReflectionClass($class);
//implementsInterface() 测试是否实现了某个特定的接口
if($reflectionClass->implementsInterface('Iplugin'))
{
$plugins[] = $reflectionClass;
}
}
return $plugins;
}
//计算菜单
function computeMenu()
{
$menu = array();
foreach(findPlugins() as $plugin)
{
//hasMethod 测试判断是否有特定的方法
if($plugin->hasMethod('getMenuItems'))
{
$reflectionMethod = $plugin->getMethod('getMenuItems'); //获取方法内容
//如果为静态化的直接调用
if($reflectionMethod->isStatic()){ //是否为静态方法
$items = $reflectionMethod->invoke(null); //执行访方法
}else{
//其它情况需要先进行实例化操作
//创建一个该类实例
$pluginInstance = $plugin->newInstance();
$items = $reflectionMethod->invoke($pluginInstance);
}
$menu = array_merge($menu,$items); //进行数组合并
}
}
return $menu;
}

function computeArtides()
{
$artides = array();
foreach(findPlugins()as $plugin)
{
if($plugin->hasMethod('getArtides'))
{
$reflectionMethod = $plugin->getMethod('getArtides');
if($reflectionMethod->isStatic())
{
$items = $reflectionMethod->invoke(null);
}else{
$pluginInstance = $plugin->newInstance();
$items = $reflectionMethod->invoke($pluginInstance);
}
$artides = array_merge($artides, $items);
}
}
return $artides;
}
class MyCoolPugin implements Iplugin
{
public static function getName()
{
return "MycoolPlugin";
}
public static function getMenuItems()
{
return array(array('description'=>'MycoolPlugin','link'=>'/MyCoolPlugin'));
}
public function getArtides()
{
return array(array('path'=>'/MycoolPlugin','title'=>'this is a really cool artide','text'=>'xianglingchuan'));
}
}
$menu = computeMenu();
$artides = computeArtides();
var_dump($menu);
echo "<BR>=================<BR>";
var_dump($artides);
echo "<BR>=================<BR>";
?>

  
页: [1]
查看完整版本: PHP 反射 初步测试