反射API(一)
<?php function classData(ReflectionClass $class)
{
echo '<hr>';
$details = '当前文件:';
$details .= $class->getFilename() . PHP_EOL;
$details .= '类名:' . $class->getName() . PHP_EOL;
$details .= '起始行:' . $class->getStartLine() . PHP_EOL;
$details .= '结束行:' . $class->getEndLine() . PHP_EOL;
if ($class->isUserDefined()) {
$details .= '由用户定义' . PHP_EOL;
}
if ($class->isInternal()) {
$details .= '由扩展或核心在内部定义' . PHP_EOL;
}
if ($class->isInterface()) {
$details .= '是一个接口' . PHP_EOL;
}
if ($class->isAbstract()) {
$details .= '是final类' . PHP_EOL;
}
if ($class->isFinal()) {
$details .= '是抽象类' . PHP_EOL;
}
if ($class->isInstantiable()) {
$details .= '可实例化' . PHP_EOL;
} else {
$details .= '不能实例化' . PHP_EOL;
}
return $details;
} function methodData(ReflectionMethod $method)
{
echo '<hr>';
$details = '当前文件:';
$details .= $method->getFilename() . PHP_EOL;
$details .= '方法名:' . $method->getName() . PHP_EOL;
$details .= '起始行:' . $method->getStartLine() . PHP_EOL;
$details .= '结束行:' . $method->getEndLine() . PHP_EOL;
if ($method->isUserDefined()) {
$details .= '用户定义' . PHP_EOL;
}
if ($method->isInternal()) {
$details .= '是内置函数' . PHP_EOL;
}
if ($method->isPublic()) {
$details .= '是公开方法' . PHP_EOL;
}
if ($method->isProtected()) {
$details .= '是保护方法' . PHP_EOL;
}
if ($method->isPrivate()) {
$details .= '是私有方法' . PHP_EOL;
}
if ($method->isStatic()) {
$details .= '是静态方法' . PHP_EOL;
}
if ($method->isFinal()) {
$details .= '是定义final' . PHP_EOL;
}
if ($method->isConstructor()) {
$details .= '是构造方法' . PHP_EOL;
}
if ($method->returnsReference()) {
// 只有在方法前加 & 才返回true
$details .= '返回参考信息' . PHP_EOL;
}
// var_dump($method->getDocComment()); return $details;
} function argData(ReflectionParameter $arg)
{
echo '<hr>';
$details = '';
$declaringclass = $arg->getDeclaringClass();
$name = $arg->getName();
$class = $arg->getClass();
$position = $arg->getPosition();
$details .= $name . '是' . $position . '个参数' . PHP_EOL;
if (!empty($class)) {
$classname = $class->getName();
$details .= $name . '必须是' . $classname . '的对象' . PHP_EOL;
}
if ($arg->isPassedByReference()) {
$details .= $name . '是引用传值' . PHP_EOL;
}
if ($arg->isDefaultValueAvailable()) {
$details .= $name . '有默认值' . PHP_EOL;
} return $details;
} class A
{ } class Product
{
public $name;
protected $price;
private $obj; public function __construct(&$name, $price = 5.99, A $a = null)
{
$this->name = $name;
$this->price = $price;
} /**
* [say description]
* @return [type] [description]
*/
public function say()
{
echo 'name:' . $this->name . ' price:' . $this . price;
}
} echo '<pre>';
$obj = new ReflectionClass('Product');
echo classData($obj); foreach ($obj->getMethods() as $key => $value) {
echo methodData($value);
} foreach ($obj->getMethod('__construct')->getParameters() as $key => $value) {
echo argData($value);
} // var_dump(Reflection::export($obj));
// var_dump(ReflectionClass::export('Product'));
// var_dump(ReflectionMethod::export('Product', 'say'));
反射API(一)的更多相关文章
- PHP 高级编程(2/5) - 反射API
PHP 5 具有完整的反射 API,添加了对类.接口.函数.方法和扩展进行反向工程的能力. 此外,反射 API 提供了方法来取出函数.类和方法中的文档注释.通过使用反射API可以分析其他的类.接口.方 ...
- 了解一下OOP的反射API
PHP5的类和对象函数并没有告诉我们类内部的所有一切,而只是报告了它们的公共成员.要充分了解一个类,需要知道其私有成员和保护成员,还要知道其方法所期望的参数 .对此,使用反射API. 1 查看自定义类 ...
- PHP反射API
近期忙着写项目,没有学习什么特别新的东西,所以好长时间没有更新博客.我们的项目用的是lumen,是基于laravel的一个轻量级框架,我看到里面用到了一些反射API机制来帮助动态加载需要的类.判断方法 ...
- 反射——反射API,使用反射创建数组
反射API Java.lang.Reflect库 ① Class类与Java.lang.Reflect类库一起对反射的概念进行支持. ② java.lang包下: a) Cla ...
- Java学习笔记--反射API
反射API 1.反射API的介绍 通过反射API可以获取Java程序在运行时刻的内部结构.比如Java类中包含的构造方法.域和方法等元素,并可以与这些元素进行交换. 按照 一般地面向对象的设计 ...
- 详解PHP反射API
PHP中的反射API就像Java中的java.lang.reflect包一样.它由一系列可以分析属性.方法和类的内置类组成.它在某些方面和对象函数相似,比如get_class_vars(),但是更加灵 ...
- Java反射API研究(1)——注解Annotation
注解在表面上的意思,只是标记一下这一部分,最好的注解就是代码自身.而在java上,由于注解的特殊性,可以通过反射API获取,这种特性使得注解被广泛应用于各大框架,用于配置内容,代替xml文件配置. 要 ...
- JDK1.7新特性(4):java语言动态性之反射API
直接通过一个代码示例来熟悉java中通过反射来对构造函数/域以及方法处理的相关API: package com.rampage.jdk7.chapter2; import java.lang.refl ...
- PHP面向对象深入研究之【了解类】与【反射API】
了解类 class_exists验证类是否存在 <?php // TaskRunner.php $classname = "Task"; $path = "task ...
- Atitit.跨语言反射api 兼容性提升与增强 java c#。Net php js
Atitit.跨语言反射api 兼容性提升与增强 java c#.Net php js 1. 什么是反射1 1.1. 反射提供的主要功能:1 1.2. 实现反射的过程:1 ...
随机推荐
- #pragma data_seg() 共享数据// MyData段 // 进程 // DLL
https://www.cnblogs.com/dongsheng/p/4476157.html http://www.cnblogs.com/CBDoctor/archive/2013/01/26/ ...
- (转) GAN论文整理
本文转自:http://www.jianshu.com/p/2acb804dd811 GAN论文整理 作者 FinlayLiu 已关注 2016.11.09 13:21 字数 1551 阅读 1263 ...
- 【Hadoop 分布式部署 二:分布式环境预备工作(主机名 IP地址等设置)】
1.首先使用工具连接上 这三台虚拟主机 2.配置主机名 切换到 root 用户 第一种方式 可以使用命令 hostname [要更改的主机名] 但是这种更改主机名的方式 ...
- Bytom交易说明(UTXO用户自己管理模式)
比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom 该部分主 ...
- spring与mybatis四种整合方法
转载: 1.采用数据映射器(MapperFactoryBean)的方式,不用写mybatis映射文件,采用注解方式提供相应的sql语句和输入参数. (1)Spring配置文件: <!-- 引 ...
- vscode "没有活动的源代码控制提供程序" 解决办法
确保安装git F1,输入Show built-in Extensions, 左侧列表中找Git,然后启用即可
- HDU 4557 Tree(可持久化字典树 + LCA)
http://acm.hdu.edu.cn/showproblem.php?pid=4757 题意: 给出一棵树,每个结点有一个权值,现在有多个询问,每次询问包含x,y,z三个数,求出在x到y的路径上 ...
- async函数对比Generator函数
首先定义一个读取文件的异步函数 var readFile = function(fileName){ return new Promise((resolve,reject)=>{ fs.read ...
- hdu 6070 Dirt Ratio 线段树+二分
Dirt Ratio Time Limit: 18000/9000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)Spe ...
- Pg MySQL
https://blog.csdn.net/tiandao2009/article/details/79839037 1架构 2对sql支持的完备性 3join Nest join , 4表分区 p ...