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[0]}</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>";

?>

  

posted @ 2013-07-02 20:08  简单--生活  阅读(5505)  评论(0编辑  收藏  举报
简单--生活(CSDN)