zoukankan      html  css  js  c++  java
  • 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>";
    
    ?>
    

      

  • 相关阅读:
    list与map的区别
    [BJOI2019]光线——递推
    [BJOI2019]奥术神杖——AC自动机+DP+分数规划+二分答案
    [BJOI2019]送别——非旋转treap
    [BJOI2019]排兵布阵——分组背包
    [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分
    BZOJ2300[HAOI2011]防线修建——非旋转treap+凸包(平衡树动态维护凸包)
    BZOJ3033太鼓达人——哈密顿回路/欧拉回路
    BZOJ3236[Ahoi2013]作业——莫队+树状数组/莫队+分块
    BZOJ2339[HNOI2011]卡农——递推+组合数
  • 原文地址:https://www.cnblogs.com/xiangxiaodong/p/3167842.html
Copyright © 2011-2022 走看看