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