安静
PHP技术博客

130726 php 关于反射

自反馈 弱点 不知PHP 反射 应用,场景,随学习之。

1:关于学习后 对于 PHP 反射的理解:

PHP反射 即 根据反射函数 Reflection 可反馈 class ,function 的 情况 ,状态 ,属性,并且支持 实例化 并且调用 函数。

2:关于 学习过程代码:

Demo 1:

class ga{
	public function gd(){
		echo "en dashi nihao";
	}

}
$class=new ReflectionClass('ga');    //建立 fuc这个类的反射类
echo $class; //输出这反射类!

Demo 2 :

//输出反射API的完整最新的导出结果
Reflection::export(new ReflectionExtension('reflection'));
//使用反射技术来创建所有内置类的导出结果
foreach(get_declared_classes() as $class)
{
	Reflection::export(new ReflectionClass($class));
}
//获取用户声明类的导出结果
class userClass
{
	public function userMethod($userPatameter = 'default')
	{
	}
}
foreach(get_declared_classes() as $class)
{
	$reflectionClass = new ReflectionClass($class);
	if($reflectionClass->isUserDefined())
	{
		Reflection::export($reflectionClass);
	}
}

Demo 3 : PHP 反射 应用场景 插件实现

<?php
//定义插件的接口规则
interface IPlugin
{
public static function getName();
}
//使用反射查找所有的插件
function findPlugins()
{
$plugins = array();
// 获取所有当前 已经加载的class 
foreach(get_declared_classes() as $class)
{
// 实例化一个反射 class的对象
$reflectionClass = new ReflectionClass($class);
//检查是否继承 IPlugin 接口
if($reflectionClass->implementsInterface('Iplugin'))
{
$plugins[] = $reflectionClass;
}
}
return $plugins;
}
//确定用于菜单的类成员
function computeMenus()
{
$menu = array();
if($plugins = findPlugins())
{
//遍历 所有 实现  IPlugin 插件的 Class
foreach($plugins as $plugin)
{
//检查是否存在函数  getMenuItems
if($plugin->hasMethod('getMenuItems'))
{
//获取  getMenuItems 函数属性
$reflectionMethod = $plugin->getMethod('getMenuItems');
//如果该函数 的 标注为  static   则继续
if($reflectionMethod->isStatic())
{
//执行 Method
$item = $reflectionMethod->invoke(null);
}
else
{
//执行method    不过我这里没懂  为什么  $plugins 和 $plugin 都可以
$pluginInstance = $plugins->newInstance();
//调用 很 反射啊  
$item = $reflectionMethod->invoke($pluginInstance);
}
}
//Item必须返回的是数组
$menu = array_merge($menu, $item);
}
}
return $menu;
}
//确定用于侧边类和文章类的成员
function computeArticles()
{
$articles = array();
if($plugins = findPlugins())
{
foreach($plugins as $plugin)
{
if($plugin->hasMethod('getArticles'))
{
$reflectionMethod = $plugin->getMethod('getArticles');
if($reflectionMethod->isStatic())
{
$item = $reflectionMethod->invoke(null);
}
else
{
$pluginInstance = $plugins->newInstance();
$item = $reflectionMethod->invoke($pluginInstance);
}
}
//Item必须返回的是数组
$articles = array_merge($articles, $item);
}
}
return $articles;
}
function computeSideBars()
{
$sidebars = array();
if(!($plugins = findPlugins()))
{
foreach($plugins as $plugin)
{
if($plugin->hasMethod('getsidebars'))
{
$reflectionMethod = $plugin->getMethod('getsidebars');
if($reflectionMethod->isStatic())
{
$item = $reflectionMethod->invoke(null);
}
else
{
$pluginInstance = $plugins->newInstance();
$item = $reflectionMethod->invoke($pluginInstance);
}
}
//Item必须返回的是数组
$sidebars = array_merge($sidebars, $item);
}
}
return $sidebars;
}
//创建一个用于测试的插件
class MyBlogPlugin implements Iplugin
{
public static function getName()
{
return 'BlogName For Iphper';
}
public static function getMenuItems()
{
return array(array(
'brief'=>'My Iphper Blog',
'link'=>'http://www.iphper.com',
));
}
public static function getArticles()
{
return array(array(
'path'=>'http://www.iphper.com/archives/202.html',
'title'=>'This a Iphper Blog title',
'text'=>'This is a good Blog For studying PHP',
));
}
}
//以下的代码可以使更加复杂的代码
$menu = computeMenus();
print_r($menu);
$articles = computeArticles();
print_r($articles);
$sidebars = computeSideBars();
print_r($sidebars);

参考:
1:http://php.net/manual/zh/book.reflection.php PHP反射 手册
2:http://www.douban.com/note/217633029/ PHP反射初步学习
3: http://www.iphper.com/?p=202 php 反射进阶

赞(0) 打赏
未经允许不得转载:AJ's Blog » 130726 php 关于反射
分享到: 更多 (0)

评论 2

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #-49

    国庆节再次来访,表示支持

    三五资源网7年前 (2013-10-03)
  2. #-48

    长知识啦,谢谢楼主分享

    外教7年前 (2013-11-14)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏