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

?>

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM