反射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 ...
随机推荐
- .net Core 2.1 后 Session保存,新页面获取不到值
https://blog.csdn.net/kuui_chiu/article/details/81060051 https://blog.csdn.net/niunan/article/detail ...
- (转)Understanding, generalisation, and transfer learning in deep neural networks
Understanding, generalisation, and transfer learning in deep neural networks FEBRUARY 27, 2017 Thi ...
- 20165306 实验二 Java面向对象程序设计
实验二 Java面向对象程序设计 实验要求 1.提交最后三个JUnit测试用例(正常情况,错误情况,边界情况)都通过的截图,截图上要有画图加水印,输入自己的学号.本提交点考查JUnit会不会使用,测试 ...
- Gym 100247I Meteor Flow(优先队列)
https://vjudge.net/problem/Gym-100247I 题意:有一艘飞船,现在有n颗流星坠落会攻击到飞船,每颗流星会在t时刻降落,对飞船造成d的伤害,飞船会有一个保护盾,初始值为 ...
- C#深入多线程
主线程: th = Thread.CurrentThread; //现在的线程为主线程 th.Name = "MainThread"; //set线程名字:主线程本身没有名字 th ...
- VS 编译后 install报错(error MSB3073)
vs编译出现如下错误: 错误 1 error MSB3073: 命令"setlocal H:\PCL_BACKUP\PCL\CMake\bin\cmake.exe -DBUILD_TYPE= ...
- json扩展
using Newtonsoft.Json.Linq; namespace Utility { public static class JsonExt { /// <summary> // ...
- JavaScript的sort方法
说明 array.sort()用于对数组进行排序,返回数组,方法默认是“升序”排序,原数组会发生改变 简单点:比较函数两个参数a和b,返回a-b升序,返回b-a升序 普通数组(降序) var arr ...
- 理解 Redis(6) - List 值
list 值就是一组根据插入顺序排列的字符串, 从左向右排列, 左边为头(head), 右侧为尾(tail). 左边为顶部, 右边为底部. 下图为 list 值的示意图: 从左侧开始向键为 num 的 ...
- _itemmod_hidden
该表中的物品放在背包或银行中中会计算属性 `entry`物品ID `comment` 备注