安静
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

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

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

    长知识啦,谢谢楼主分享

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

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

支付宝扫一扫打赏

微信扫一扫打赏