反射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 ...
随机推荐
- SCU 4439 Vertex Cover(二分图最小覆盖点)题解
题意:每一条边至少有一个端点要涂颜色,问最少涂几个点 思路:最小顶点覆盖:用最少的点,让每条边都至少和其中一个点关联,显然是道裸最小顶点覆盖题: 参考:二分图 代码: #include<iost ...
- 102. Binary Tree Level Order Traversal 广度优先遍历
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...
- wamp phpcms部署网站问题
服务器使用自己的服务器,域名申请后通过信息服务iis管理器建网站,并将物理地址指定到wamp的www目录中的网站的根目录.这时候如果网站首页已经生成后访问域名将进入网站首页. 出现的问题: 1.导航( ...
- 文件IO(2)
Lseek: *************************************************************************** 实验一: ...
- WEB 安全学习 一、mysql 注入漏洞
转载: https://www.cnblogs.com/cui0x01/p/8620524.html 一.Mysql数据库结构 数据库A 表名 列名 数据 数据库B 表名 列名 数据 Mysql5.0 ...
- Nuget 打包 for .Net Standart project
Create .NET Standard packages with Visual Studio 2015 Publishing packages nuge.exe 放在项目目录中 nuget spe ...
- matplotlib python
#导入包 import matplotlib.pyplot as plt import numpy as np # 从[-1,1]中等距去50个数作为x的取值 x = np.linspace(-1, ...
- 初步:jenkins自动构建安卓Apk
1:本地搭建jenkins 2:下载插件 3:配置相关信息(git,sdk等等) 3:拉取git仓库代码 4:编译执行 参考文章:http://www.cnblogs.com/reblue520/p/ ...
- HTML学习笔记CSS
类选择器和ID选择器的区别 1id只能用一回,类可以循环使用 2可以使用类选择器词列表方法为一个元素同时设置多个样式.我们可以为一个元素同时设多个样式,但只可以用类选择器的方法实现,ID选择器是不可以 ...
- _lottery
通过积分购买彩票,奖励以积分形式发放 当aaa_chance,max_chance,min_chance均为0时,自动计算系统最小积分开销进行开奖