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