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 ...
随机推荐
- [转]Windows 下 Apache Virtual hosts 简单配置
From : http://blog.csdn.net/wuerping/article/details/4164362 /* Author : Andrew.Wu [ Created on : 20 ...
- Java工程Properties配置文件注释中文,会自动转换为其他编码方式问题解决 中文乱码
properties文件中想注释中文,但是写出来后却是 :# /4djf/234/4354/r23df/324d 这种效果 是因为字符编码默认没有设置造成的,以前总是安装插件解决此问题, 但是却牺牲 ...
- C++虚函数之接口 最简单的功能
虚函数 ,接口,到底有什么用呢? 以前我都是在C++ 里面写C,只用到 简单的C++面对对象知识 #include<stdio.h> class IServerLogic{ virtual ...
- Guava之Iterables使用示例
这是一个常量工具类.Iterables类包含了一系列的静态方法,来操作或返回Iterable对象. public final class Iterables { private Iterables() ...
- Java学习笔记——IO操作之以图片地址下载图片
以图片地址下载图片 读取给定图片文件的内容,用FileInputStream public static byte[] mReaderPicture(String filePath) { byte[] ...
- Go语言之进阶篇请求报文格式分析
1. 请求报文格式分析 示例: package main import ( "fmt" "net" ) func main() { //监听 listener, ...
- Isilon上数据是如何存放的?
OneFS的文件系统的block size是8KB.这是OneFS上最小的数据存储单位了,比8KB小的文件都要占掉8KB大小的空间.连续的8KB的block会被用来存储文件的数据,但最多不会超过16个 ...
- python3 中对arrow库的总结(转发)
https://blog.csdn.net/soft_kind/article/details/80614896 arrow库的官方文档:http://arrow.readthedocs.io/en/ ...
- 转:EM算法总结
https://applenob.github.io/em.html EM算法总结 在概率模型中,最常用的模型参数估计方法应该就是最大似然法. EM算法本质上也是最大似然,它是针对模型中存在隐变量的情 ...
- AdMaster技术副总裁谈Hadoop、营销数据、Python和挖掘平台
http://www.infoq.com/cn/news/2014/09/admaster-hadoop 卢亿雷是现任AdMaster技术副总裁,曾在联想研究院.百度基础架构部.Carbonite C ...