PHP 反射 初步测试
<?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 反射 初步测试的更多相关文章
- Emotiv脑电设备与RDS机器人仿真初步测试
Emotiv脑电设备与RDS机器人仿真初步测试 在脑电设备相关算法进行真实机器人测试前,有必要进行大量仿真验证算法,节约开发时间. 这里给我启发的Emotiv使用所参考的一些网址. 官网:https: ...
- Java反射-初步入门
Java反射-初步入门 学反射先了解什么是反射. 百度百科:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动 ...
- Java调用Kotlin事项及Kotlin反射初步
继续来研究Java调用Kotlin的一些东东. @Throws注解: 我们知道在Kotlin中是不存在checked exception的,而在Java中是存在的,那..如果从Java来调用Kotli ...
- 串口之完整封装包含发送和接收(windows+ubuntu已通过初步测试)(持续更新)
这里下载源码 更新日志 16-08-2021 V1.0.3 1.修复接收数据没有将数据传递给应用层的bug 2.windows版本:设置接收数据相邻字节间间隔为5ms 24-09-2020 V1.0. ...
- HBase写的初步测试中的表现
底 第四年HBase.在上线的机HBase集群做一个初步的测试写入性能.下面具体说明做测试内容. 说明 HBase周围环境 0.96版本号,8台region server.默认配置 写数据说明 单co ...
- 在laravel5.8中集成swoole组件----初步测试
铺垫 前提是先安装swoole组件,我采用从pecl-----php扩展组件网下载swoole扩展包,然后切入到解压缩的扩展包中运行phpize命令, phpize是一种编译命令,可以在安装文件中生成 ...
- MongoDB与PostgresQL无责任初步测试
PostgresQL一秒能插入多少条记录,MongoDB呢?读取的情况又如何?我写了一些简单的程序,得出了一些简单的数据,贴在这里分享,继续往下阅读前请注意下本文标题中的“无责任”,这表示此测试结果不 ...
- 0034 Java学习笔记-反射-初步2-操作对象
通过反射创建对象 通过反射创建对象有两种方式,一种通过Class对象的newInstance()方法,一种是获取到Class对象的Constructor后,再调用newInstance()方法,前者要 ...
- 0033 Java学习笔记-反射-初步1
先看看通过反射能干嘛 示例:修改对象的private实例变量 package testpack; import java.lang.reflect.Field; public class Test1 ...
随机推荐
- you have mixed tabs and spaces fix this
http://blog.csdn.net/tonyyan19781/article/details/60882443 Vs2013 IDE下,编辑C++的工程源码,在打开文件的时候,会出现 " ...
- Java NIO和IO的区别(转)
原文链接:Java NIO和IO的区别 下表总结了Java NIO和IO之间的主要差别,我会更详细地描述表中每部分的差异. 复制代码代码如下: IO NIO面向流 ...
- 整合spring cloud云架构 - SSO单点登录之OAuth2.0登录认证(1)
之前写了很多关于spring cloud的文章,今天我们对OAuth2.0的整合方式做一下笔记,首先我从网上找了一些关于OAuth2.0的一些基础知识点,帮助大家回顾一下知识点: 一.oauth中的角 ...
- AI 经典书单 | 人工智能学习该读哪些书
转载 2018年01月16日 00:00:00 人工智能相关岗位中,涉及到的内容包含: 算法.深度学习.机器学习.自然语言处理.数据结构.Tensorflow.Python .数据挖掘.搜索开发. ...
- 关于UITableView的黑线条
这里採用分组形式.底色可用图片覆盖,设置为cell(是一个view)的子视图,并把cell'的颜色设置为底色 当UITableView的cell没有满屏显示时,就会出现黑线条.我们仅仅需在初始化时,加 ...
- TensorFlow (RNN)深度学习 双向LSTM(BiLSTM)+CRF 实现 sequence labeling 序列标注问题 源码下载
http://blog.csdn.net/scotfield_msn/article/details/60339415 在TensorFlow (RNN)深度学习下 双向LSTM(BiLSTM)+CR ...
- SQL多表连接查询(详细实例)(转)
http://www.xker.com/page/e2012/0708/117368.html select * from student,course where student.ID=course ...
- 浅析ARM公司在物联网领域的战略布局(转)
随着ARM芯片的出货量越来越多,自信满满的ARM公司统一软硬件平台的战略和雄心壮志越来越凸显.最初ARM公司仅是出售自己的知识产权(IP核)给各大芯片公司,由于最初ARM公司处于劣势,所以给芯片厂商很 ...
- Android中创建PopupMenu弹出式菜单
之前写过一篇创建option menu的文章:Android中创建option menu 本文主要是讲如何创建PopupMenu弹出式菜单 1.首先创建menu文件menu2.xml: <?xm ...
- iOS 国际化 NSLocalizedString
iOS 国际化.根据系统不同的语言自动切换. 首先.选择项目 Add new file -->iOS -->Resource -->Strings File . 命名为Locali ...