<?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(一)的更多相关文章

  1. PHP 高级编程(2/5) - 反射API

    PHP 5 具有完整的反射 API,添加了对类.接口.函数.方法和扩展进行反向工程的能力. 此外,反射 API 提供了方法来取出函数.类和方法中的文档注释.通过使用反射API可以分析其他的类.接口.方 ...

  2. 了解一下OOP的反射API

    PHP5的类和对象函数并没有告诉我们类内部的所有一切,而只是报告了它们的公共成员.要充分了解一个类,需要知道其私有成员和保护成员,还要知道其方法所期望的参数 .对此,使用反射API. 1 查看自定义类 ...

  3. PHP反射API

    近期忙着写项目,没有学习什么特别新的东西,所以好长时间没有更新博客.我们的项目用的是lumen,是基于laravel的一个轻量级框架,我看到里面用到了一些反射API机制来帮助动态加载需要的类.判断方法 ...

  4. 反射——反射API,使用反射创建数组

    反射API Java.lang.Reflect库 ①   Class类与Java.lang.Reflect类库一起对反射的概念进行支持. ②   java.lang包下: a)         Cla ...

  5. Java学习笔记--反射API

    反射API 1.反射API的介绍 通过反射API可以获取Java程序在运行时刻的内部结构.比如Java类中包含的构造方法.域和方法等元素,并可以与这些元素进行交换.     按照 一般地面向对象的设计 ...

  6. 详解PHP反射API

    PHP中的反射API就像Java中的java.lang.reflect包一样.它由一系列可以分析属性.方法和类的内置类组成.它在某些方面和对象函数相似,比如get_class_vars(),但是更加灵 ...

  7. Java反射API研究(1)——注解Annotation

    注解在表面上的意思,只是标记一下这一部分,最好的注解就是代码自身.而在java上,由于注解的特殊性,可以通过反射API获取,这种特性使得注解被广泛应用于各大框架,用于配置内容,代替xml文件配置. 要 ...

  8. JDK1.7新特性(4):java语言动态性之反射API

    直接通过一个代码示例来熟悉java中通过反射来对构造函数/域以及方法处理的相关API: package com.rampage.jdk7.chapter2; import java.lang.refl ...

  9. PHP面向对象深入研究之【了解类】与【反射API】

    了解类 class_exists验证类是否存在 <?php // TaskRunner.php $classname = "Task"; $path = "task ...

  10. Atitit.跨语言反射api 兼容性提升与增强 java c#。Net  php  js

    Atitit.跨语言反射api 兼容性提升与增强 java c#.Net  php  js 1. 什么是反射1 1.1.       反射提供的主要功能:1 1.2.       实现反射的过程:1 ...

随机推荐

  1. SCU 4439 Vertex Cover(二分图最小覆盖点)题解

    题意:每一条边至少有一个端点要涂颜色,问最少涂几个点 思路:最小顶点覆盖:用最少的点,让每条边都至少和其中一个点关联,显然是道裸最小顶点覆盖题: 参考:二分图 代码: #include<iost ...

  2. 102. Binary Tree Level Order Traversal 广度优先遍历

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  3. wamp phpcms部署网站问题

    服务器使用自己的服务器,域名申请后通过信息服务iis管理器建网站,并将物理地址指定到wamp的www目录中的网站的根目录.这时候如果网站首页已经生成后访问域名将进入网站首页. 出现的问题: 1.导航( ...

  4. 文件IO(2)

    Lseek:       ***************************************************************************    实验一:     ...

  5. WEB 安全学习 一、mysql 注入漏洞

    转载: https://www.cnblogs.com/cui0x01/p/8620524.html 一.Mysql数据库结构 数据库A 表名 列名 数据 数据库B 表名 列名 数据 Mysql5.0 ...

  6. Nuget 打包 for .Net Standart project

    Create .NET Standard packages with Visual Studio 2015 Publishing packages nuge.exe 放在项目目录中 nuget spe ...

  7. matplotlib python

    #导入包 import matplotlib.pyplot as plt import numpy as np # 从[-1,1]中等距去50个数作为x的取值 x = np.linspace(-1, ...

  8. 初步:jenkins自动构建安卓Apk

    1:本地搭建jenkins 2:下载插件 3:配置相关信息(git,sdk等等) 3:拉取git仓库代码 4:编译执行 参考文章:http://www.cnblogs.com/reblue520/p/ ...

  9. HTML学习笔记CSS

    类选择器和ID选择器的区别 1id只能用一回,类可以循环使用 2可以使用类选择器词列表方法为一个元素同时设置多个样式.我们可以为一个元素同时设多个样式,但只可以用类选择器的方法实现,ID选择器是不可以 ...

  10. _lottery

    通过积分购买彩票,奖励以积分形式发放 当aaa_chance,max_chance,min_chance均为0时,自动计算系统最小积分开销进行开奖