当前位置:首页 > PHP教程 > php高级应用 > 列表

实例介绍PHP的Reflection反射机制

发布:smiling 来源: PHP粉丝网  添加日期:2021-03-28 21:16:52 浏览: 评论:0 

这篇文章主要介绍了实例介绍PHP的Reflection反射机制,本文从使用Reflection获取一个类的信息角度来介绍PHP的Reflection反射机制,需要的朋友可以参考下

PHP5添加了一项新的功能:Reflection。这个功能使得程序员可以reverse-engineer class, interface,function,method and extension。通过PHP代码,就可以得到某object的所有信息,并且可以和它交互。

假设有一个类Person:

  1. class Person {  
  2.  /** 
  3.      * For the sake of demonstration, we"re setting this private 
  4.      */ 
  5.     private $_allowDynamicAttributes = false; 
  6.  
  7.     /** type=primary_autoincrement */ 
  8.     protected $id = 0; 
  9.  
  10.     /** type=varchar length=255 null */ 
  11.     protected $name
  12.  
  13.     /** type=text null */ 
  14.     protected $biography
  15.  
  16.         public function getId() 
  17.         { 
  18.          return $this->id; 
  19.         } 
  20.         public function setId($v
  21.         { 
  22.             $this->id = $v
  23.         } 
  24.         public function getName() 
  25.         { 
  26.          return $this->name; 
  27.         } 
  28.         public function setName($v
  29.         { 
  30.           $this->name = $v
  31.         } 
  32.         public function getBiography() 
  33.         { 
  34.            return $this->biography; 
  35.         } 
  36.         public function setBiography($v
  37.         { 
  38.           $this->biography = $v
  39.         } 

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

1.常量 Contants

2.属性 Property Names

3.方法 Method Names

4.静态属性 Static Properties

5.命名空间 Namespace

6.Person类是否为final或者abstract

只要把类名"Person"传递给ReflectionClass就可以了:

$class = new ReflectionClass('Person');

获取属性(Properties):

  1. $properties = $class->getProperties(); 
  2. foreach($properties as $property) { 
  3.     echo $property->getName()."\n"
  4. // 输出: 
  5. // _allowDynamicAttributes 
  6. // id 
  7. // name 
  8. // biography 

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

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

可用参数列表:

  1. ReflectionProperty::IS_STATIC 
  2. ReflectionProperty::IS_PUBLIC 
  3. ReflectionProperty::IS_PROTECTED 
  4. ReflectionProperty::IS_PRIVATE 

如果要同时获取public 和private 属性,就这样写:ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED

应该不会感觉陌生吧。

通过$property->getName()可以得到属性名,通过getDocComment可以得到写给property的注释,代码如下:

  1. foreach($properties as $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. // Output: 
  8. // primary_autoincrement 
  9. // varchar 
  10. // text 

有点不可思议了吧。竟然连注释都可以取到。

获取方法(methods):通过getMethods() 来获取到类的所有methods。返回的是ReflectionMethod对象的数组。不再演示。

最后通过ReflectionMethod来调用类里面的method。

代码如下:

  1. $data = array("id" => 1, "name" => "Chris""biography" => "I am am a PHP developer"); 
  2. foreach($data as $key => $value) { 
  3.     if(!$class->hasProperty($key)) { 
  4.         throw new Exception($key." is not a valid property"); 
  5.     } 
  6.  
  7.     if(!$class->hasMethod("get".ucfirst($key))) { 
  8.         throw new Exception($key." is missing a getter"); 
  9.     } 
  10.  
  11.     if(!$class->hasMethod("set".ucfirst($key))) { 
  12.         throw new Exception($key." is missing a setter"); 
  13.     } 
  14.  
  15.     // Make a new object to interact with 
  16.     $object = new Person(); 
  17.  
  18.     // Get the getter method and invoke it with the value in our data array 
  19.     $setter = $class->getMethod("set".ucfirst($key)); 
  20.     $ok = $setter->invoke($object$value); 
  21.  
  22.     // Get the setter method and invoke it 
  23.     $setter = $class->getMethod("get".ucfirst($key)); 
  24.     $objValue = $setter->invoke($object); 
  25.  
  26.     // Now compare 
  27.     if($value == $objValue) { 
  28.         echo "Getter or Setter has modified the data.\n"
  29.     } else { 
  30.         echo "Getter and Setter does not modify the data.\n"
  31.    } 

有点意思吧。

Tags: PHP反射机制 Reflection

分享到: