反射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 ...
随机推荐
- 分布式强化学习基础概念(Distributional RL )
分布式强化学习基础概念(Distributional RL) from: https://mtomassoli.github.io/2017/12/08/distributional_rl/ 1. Q ...
- WebPack填坑笔记
loader使用时不需要用require引入,在使用plugins(插件)才需要使用require引入 压缩js代码会导致热更新失效 所以开发环境先不要进行压缩 给css加前缀的 postcss-lo ...
- 使用PlaceHolder,测试碰见的问题
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFa ...
- Kubernetes简介
Kubernetes is an open-source platform designed to automate deploying, scaling, and operating applica ...
- [转载]grep查看上下文及简单正则表达式
转载自:https://www.cnblogs.com/mfryf/p/3336288.html inux grep 显示前后几行的信息2016年03月02日 14:10:58 ChenHui246 ...
- 8、nginx和tengine简介
练习: 使用nginx反向代理(rr调度)用户请求至两个以上的后端LAMP(按标准路径部署的有pma,wd),不管用户请求是什么内容都反向代理至后端服务器去,但是如果用户请求的是图片或者是html,就 ...
- 4、Python文件对象及os、os.path和pickle模块(0530)
文件系统和文件 1.文件系统是OS用于明确磁盘或分区上的文件的方法和数据结构---即在磁盘上组织文件的方法: 文件系统模块:os 2.计算机文件(称文件.电脑档案.档案),是存储在某种长期储存设备或临 ...
- 2nd,Python基础2——02
1 列表.元组操作 列表可以对数据实现最方便的存储.修改等操作 names = ['Jack', 'Leon','Eric'] 通过下表访问列表中的元素,下标从0开始计数 names = ['Jack ...
- linux 基本命令2(12月27日笔记)
1.ifconfig 作用:用于操作网卡相关的指令 简单语法:#ifconfig (获取网卡信息) 2.reboot 作用:重新启动计算机 语法1:#reboot ...
- 前端性能优化之按需加载(React-router+webpack)
一.什么是按需加载 和异步加载script的目的一样(异步加载script的方法),按需加载/代码切割也可以解决首屏加载的速度. 什么时候需要按需加载 如果是大文件,使用按需加载就十分合适.比如一个近 ...