自反馈 弱点 不知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 反射进阶
国庆节再次来访,表示支持
长知识啦,谢谢楼主分享