PHP【夯实PHP基础】PHP的反光机制

正文地址

享用提纲:

  1. 介绍

  2. 切实事例

    2.1 创建Persion类

    2.2 反射进度

    2.3 反射后采取

 

1.
介绍


  –
PHP5添加了一项新的功能:Reflection。那几个作用使得phper可以reverse-engineer
class, interface,function,method and
extension。通过PHP代码,就足以赢得某object的享有音信,并且可以和它交互。
  – 反射是何许?
它是指在PHP运行状态中,伸张分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细音信,包涵注释。那种动态获取的信息以及动态调用对象的法门的功力称为反射API。反射是控制面向对象范型中元模型的API,其功用非凡强大,可帮助大家构建复杂,可扩大的应用。
其用途如:自动加载插件,自动生成文档,甚至可用来扩大PHP语言。
php反射api由若干类组成,可扶助大家用来走访程序的元数据仍然同有关的注释交互。借助反射大家可以赢得诸如类完结了那么些方法,制造一个类的实例(分歧于用new创造),调用一个方法(也分化于常规调用),传递参数,动态调用类的静态方法。
     
反射api是php内建的oop技术增添,包涵部分类,相当和接口,综合应用他们可用来帮助大家分析任何类,接口,方法,属性,方法和扩展。那一个oop扩张被叫做反射。
      通过ReflectionClass,大家能够博得Person类的以下音讯:
     1)常量 Contants
     2)属性 Property Names
     3)方法 Method Names静态
     4)属性 Static Properties
     5)命名空间 Namespace
     6)Person类是或不是为final或者abstract

2.
实际事例


 

创造一个Person类,然后选择ReflectionClass反射它

 

   2.1)【创建Persion类】

    

PHP 1PHP 2

class Person {    
    /** 
         * For the sake of demonstration, we"re setting this private
         */
    private $_allowDynamicAttributes = false;  
    /** type=primary_autoincrement */
    protected $id = 0;  
    /** type=varchar length=255 null */
    protected $name;  
    /** type=text null */
    protected $biography;  
    publicfunction getId()  
            {  
    return $this->id;  
            }  
    public function setId($v)  
            {  
    $this->id = $v;  
            }  
    public function getName()  
            {  
    return $this->name;  
            }  
    public function setName($v)  
            {  
    $this->name = $v;  
            }  
    public function getBiography()  
            {  
    return $this->biography;  
            }  
    public function setBiography($v)  
            {  
    $this->biography = $v;  
            }  
    }

Persion

 

  2.2)【反射进度】
接下去反射它,只要把类名”Person”传递给ReflectionClass就可以了:

 

1     $class = new ReflectionClass('Person');//建立 Person这个类的反射类
2     $instance  = $class->newInstanceArgs($args);//相当于实例化Person 类

 

   2.3)【反射后使用】

    2.3.1)获取属性(Properties)

 

    $properties = $class->getProperties();  
    foreach($properties as $property) {  
    echo $property->getName()."\n";  
    }  
    // 输出:
    // _allowDynamicAttributes
    // id
    // name
    // biography

 

默许情形下,ReflectionClass会获取到所有的属性,private 和
protected的也可以。若是只想获取到private属性,就要格外传个参数:
$private_properties =
$class->getProperties(ReflectionProperty::IS_PRIVATE);
可用参数列表:
               ReflectionProperty::IS_STATIC
               ReflectionProperty::IS_PUBLIC
               ReflectionProperty::IS_PROTECTED
               ReflectionProperty::IS_PRIVATE
     假若要同时得到public 和private
属性,如同此写:ReflectionProperty::IS_PUBLIC |
ReflectionProperty::IS_PROTECTED。
   通过$property->getName()可以拿走属性名。

    2.3.2)【获取注释】

 

  通过getDocComment可以拿走写给property的笺注。

 

 1     foreach($propertiesas$property) {  
 2     if($property->isProtected()) {  
 3     $docblock = $property->getDocComment();  
 4             preg_match('/ type\=([a-z_]*) /', $property->getDocComment(), $matches);  
 5     echo$matches[1]."\n";  
 6         }  
 7     }  
 8     // Output:
 9     // primary_autoincrement
10     // varchar
11     // text

 

    2.3.3)【获取类的法门】

    获取格局(methods):通过getMethods() 来获取到类的所有methods。

    2.3.4)【执行类的主意】

 

1         $instance->getBiography(); //执行Person 里的方法getBiography
2         //或者:
3         $ec=$class->getmethod('getName');  //获取Person 类中的getName方法
4         $ec->invoke($instance);       //执行getName 方法

相关文章