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

  

PHP 反射 初步测试的更多相关文章

  1. Emotiv脑电设备与RDS机器人仿真初步测试

    Emotiv脑电设备与RDS机器人仿真初步测试 在脑电设备相关算法进行真实机器人测试前,有必要进行大量仿真验证算法,节约开发时间. 这里给我启发的Emotiv使用所参考的一些网址. 官网:https: ...

  2. Java反射-初步入门

    Java反射-初步入门 学反射先了解什么是反射. 百度百科:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动 ...

  3. Java调用Kotlin事项及Kotlin反射初步

    继续来研究Java调用Kotlin的一些东东. @Throws注解: 我们知道在Kotlin中是不存在checked exception的,而在Java中是存在的,那..如果从Java来调用Kotli ...

  4. 串口之完整封装包含发送和接收(windows+ubuntu已通过初步测试)(持续更新)

    这里下载源码 更新日志 16-08-2021 V1.0.3 1.修复接收数据没有将数据传递给应用层的bug 2.windows版本:设置接收数据相邻字节间间隔为5ms 24-09-2020 V1.0. ...

  5. HBase写的初步测试中的表现

    底 第四年HBase.在上线的机HBase集群做一个初步的测试写入性能.下面具体说明做测试内容. 说明 HBase周围环境 0.96版本号,8台region server.默认配置 写数据说明 单co ...

  6. 在laravel5.8中集成swoole组件----初步测试

    铺垫 前提是先安装swoole组件,我采用从pecl-----php扩展组件网下载swoole扩展包,然后切入到解压缩的扩展包中运行phpize命令, phpize是一种编译命令,可以在安装文件中生成 ...

  7. MongoDB与PostgresQL无责任初步测试

    PostgresQL一秒能插入多少条记录,MongoDB呢?读取的情况又如何?我写了一些简单的程序,得出了一些简单的数据,贴在这里分享,继续往下阅读前请注意下本文标题中的“无责任”,这表示此测试结果不 ...

  8. 0034 Java学习笔记-反射-初步2-操作对象

    通过反射创建对象 通过反射创建对象有两种方式,一种通过Class对象的newInstance()方法,一种是获取到Class对象的Constructor后,再调用newInstance()方法,前者要 ...

  9. 0033 Java学习笔记-反射-初步1

    先看看通过反射能干嘛 示例:修改对象的private实例变量 package testpack; import java.lang.reflect.Field; public class Test1 ...

随机推荐

  1. Windows10更新后,远程桌面无法登录服务器 提示远程桌面协议 CredSSP 出现漏洞

    Win10远程桌面 出现 身份验证错误,要求的函数不受支持,这可能是由于CredSSP加密Oracle修正 解决方法 打开注册表,手动建立 这个路径 HKEY_LOCAL_MACHINE\SOFTWA ...

  2. 如何使用pycharm调试(debug) django的测试用例?

    一.django应用或者flask应用的调试: 结合debug模式,在代码处添加断点,即可实现断点调试功能 二. django应用或者flask应用测试用例的调试: 一般django应用的测试用例执行 ...

  3. 日历控件My97DatePicker WdatePicker屏蔽 onchange的解决方法

    http://www.cnblogs.com/wan-feng/archive/2013/12/13/3473439.html 受下面文章的启发,使用DatePicker自带的年月日相关的change ...

  4. Windows10系统.NET Framework 3.5离线安装方法

    Win10技术预览版给用户们带来很多新功能的同时,也给用户们带来了不害臊的麻烦与问题.其中.NET Framework 4.5是系统预装的,但是在Win10技术预览版中的部分应用需要.NET Fram ...

  5. grunt-cmd-transport提取deps[]的BUG

    该BUG已经在GitHub上提了issue,详见:#56 文件 // employee/static/adder.js define(function (require, exports) { exp ...

  6. php+C#.net混合开发

    php+C#.net混合开发 上图一张,左右是php语言,右边是C#语言,解决方案中的php项目是红色的小标识

  7. ASP入门(十七)-ASP #include

    通过使用 #include 指令,您可以在服务器执行 ASP 文件之前,把另一个 ASP 文件的内容插入到这个 ASP 文件中. 如何使用 #include 指令 这里有一个名为 mypage.asp ...

  8. iOS中文API之UIResponder介绍

    该UIResponder类定义了响应和处理事件的对象接口.它是UIView和UIApplication的超类(UIWindow).这些类的实例有时被称为响应者对象,简单地说就是响应者. 通常有2种事件 ...

  9. [Canvas]奔跑的马

    下载地址:https://files.cnblogs.com/files/xiandedanteng/52-WalkingHorse.rar,请用Chrome浏览器打开观看动态效果. 图例: 源码: ...

  10. Mybatis源码分析之Cache一级缓存原理(四)

    之前的文章我已经基本讲解到了SqlSessionFactory.SqlSession.Excutor以及Mpper执行SQL过程,下面我来了解下myabtis的缓存, 它的缓存分为一级缓存和二级缓存, ...