zoukankan      html  css  js  c++  java
  • 通过ReflectionMethod,我们可以得到Person类的某个方法的信息

    PHP反射api由若干类组成,可帮助我们用来访问程序的元数据或者同相关的注释交互。借助反射我们可以获取诸如类实现了那些方法,创建一个类的实例(不同于用new创建),调用一个方法(也不同于常规调用),传递参数,动态调用类的静态方法。

    反射api是PHP内建的OOP技术扩展,包括一些类,异常和接口,综合使用他们可用来帮助我们分析其它类,接口,方法,属性,方法和扩展。这些OOP扩展被称为反射。

    平常我们用的比较多的是 ReflectionClass类 和 ReflectionMethod类,例如:

    01 <?php

    02 class Person {

    03

    04 /**

    05 * For the sake of demonstration, we"re setting this private

    06 */

    07 private $_allowDynamicAttributes = false;

    08

    09 /**

    10 * type=primary_autoincrement

    11 */

    12 protected $id = 0;

    13

    14 /**

    15 * type=varchar length=255 null

    16 */

    17 protected $name;

    18

    19 /**

    20 * type=text null

    21 */

    22 protected $biography;

    23

    24 public function getId() {

    25 return $this->id;

    26 }

    27

    28 public function setId($v) {

    29 $this->id = $v;

    30 }

    31

    32 public function getName() {

    33 return $this->name;

    34 }

    35

    36 public function setName($v) {

    37 $this->name = $v;

    38 }

    39

    40 public function getBiography() {

    41 return $this->biography;

    42 }

    43

    44 public function setBiography($v) {

    45 $this->biography = $v;

    46 }

    47 }

    一、通过ReflectionClass,我们可以得到Person类的以下信息:

    常量 Contants

    属性 Property Names

    方法 Method Names静态

    属性 Static Properties

    命名空间 Namespace

    Person类是否为final或者abstract

    Person类是否有某个方法

    接下来反射它,只要把类名"Person"传递给ReflectionClass就可以了:

    1 $class = new ReflectionClass('Person'); // 建立 Person这个类的反射类

    2 $instance = $class->newInstanceArgs($args); // 相当于实例化Person 类

    1)获取属性(Properties):

    1 $properties = $class->getProperties();

    2 foreach ($properties as $property) {

    3 echo $property->getName() . " ";

    4 }

    5 // 输出:

    6 // _allowDynamicAttributes

    7 // id

    8 // name

    9 // biography

    默认情况下,ReflectionClass会获取到所有的属性,private 和 protected的也可以。如果只想获取到private属性,就要额外传个参数:

    1 $private_properties = $class->getProperties(ReflectionProperty::IS_PRIVATE);

    可用参数列表:

    ReflectionProperty::IS_STATIC

    ReflectionProperty::IS_PUBLIC

    ReflectionProperty::IS_PROTECTED

    ReflectionProperty::IS_PRIVATE

    通过$property->getName()可以得到属性名。

    2)获取注释:

    通过getDocComment可以得到写给property的注释。

    01 foreach ($properties as $property) {

    02 if ($property->isProtected()) {

    03 $docblock = $property->getDocComment();

    04 preg_match('/ type=([a-z_]*) /', $property->getDocComment(), $matches);
    05 echo $matches[1] . " ";

    06 }

    07 }

    08 // Output:

    09 // primary_autoincrement

    10 // varchar

    11 // text

    3)获取类的方法

    getMethods() 来获取到类的所有methods。

    hasMethod(string) 是否存在某个方法

    getMethod(string) 获取方法

    4)执行类的方法:

    1 $instance->getName(2881064151); // 执行Person 里的方法getName

    2 // 或者:

    3 $method = $class->getmethod('getName'); // 获取Person 类中的getName方法

    4 $method->invoke($instance); // 执行getName 方法

    5 // 或者:

    6 $method = $class->getmethod('setName'); // 获取Person 类中的setName方法

    7 $method->invokeArgs($instance, array('snsgou.com'));

    二、通过ReflectionMethod,我们可以得到Person类的某个方法的信息:

    是否“public”、“protected”、“private” 、“static”类型

    方法的参数列表

    方法的参数个数

    反调用类的方法

    1 // 执行detail方法

    2 $method = new ReflectionMethod('Person', 'test');

    3

    4 if ($method->isPublic() && !$method->isStatic()) {

    5 echo 'Action is right';

    6 }

    7 echo $method->getNumberOfParameters(); // 参数个数

    8 echo $method->getParameters(); // 参数对象数组

  • 相关阅读:
    帮助应届生、年轻程序员快速成长的12个锦囊<转载>
    曾国藩教您:如何富过三代
    Mvc示例代码调试之二——调试示例讲解
    如何处理婚姻问题
    jQuery对象与dom对象相互转换
    Mvc示例代码调试之一----调试工具及设置(用firebug与vs联合调试)
    Mvc示例之三——用Filter进行简单身份验证
    沟通的艺术
    做bs开发需要学习哪些技术
    我所读过的技术书籍
  • 原文地址:https://www.cnblogs.com/cbryge/p/6080932.html
Copyright © 2011-2022 走看看