用來獲取指定的類的信息,包括類中的屬性,方法,方法權限,注釋等
用途:1.thinkPHP框架中的前置,后置控制器的實現
2.與debug_backtrace函數結合使用,文件調用的權限管理
使用方法:
1 <?php 2 class Person { 3 4 /** 5 * For the sake of demonstration, we"re setting this private 6 */ 7 private $_allowDynamicAttributes = false; 8 9 /** 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() . "\n";
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] . "\n";
06 }
07 }
08 // Output:
09 // primary_autoincrement
10 // varchar
11 // text
3)獲取類的方法
- getMethods() 來獲取到類的所有methods。
- hasMethod(string) 是否存在某個方法
- getMethod(string) 獲取方法
4)執行類的方法:
1 $instance->getName(); // 執行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(); // 參數對象數組

