PHP反射予備試験

6101 ワード

<?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>";

?>