日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

了解下PHP的Reflection反射機(jī)制

 corefashion 2014-05-15

PHP5添加了一項(xiàng)新的功能:Reflection。這個功能使得程序員可以reverse-engineer class, interface,function,method and extension。通過PHP代碼,就可以得到某object的所有信息,并且可以和它交互。

假設(shè)有一個類Person:

01class Person { 
02    /**
03     * For the sake of demonstration, we"re setting this private
04     */
05    private $_allowDynamicAttributes = false;
06  
07    /** type=primary_autoincrement */
08    protected $id = 0;
09  
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        }
40}

通過ReflectionClass,我們可以得到Person類的以下信息:

  • 常量 Contants
  • 屬性 Property Names
  • 方法 Method Names
  • 靜態(tài)屬性 Static Properties
  • 命名空間 Namespace
  • Person類是否為final或者abstract

只要把類名"Person"傳遞給ReflectionClass就可以了:

1$class = new ReflectionClass('Person');

獲取屬性(Properties):

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

默認(rèn)情況下,ReflectionClass會獲取到所有的屬性,private 和 protected的也可以。如果只想獲取到private屬性,就要額外傳個參數(shù):

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

可用參數(shù)列表:

  • ReflectionProperty::IS_STATIC
  • ReflectionProperty::IS_PUBLIC
  • ReflectionProperty::IS_PROTECTED
  • ReflectionProperty::IS_PRIVATE

如果要同時獲取public 和private 屬性,就這樣寫:ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED

應(yīng)該不會感覺陌生吧。

通過$property->getName()可以得到屬性名,通過getDocComment可以得到寫給property的注釋。

01foreach($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

有點(diǎn)不可思議了吧。竟然連注釋都可以取到。

獲取方法(methods):通過getMethods() 來獲取到類的所有methods。返回的是ReflectionMethod對象的數(shù)組。不再演示。

最后通過ReflectionMethod來調(diào)用類里面的method。

01$data = array("id" => 1, "name" => "Chris", "biography" => "I am am a PHP developer");
02foreach($data as $key => $value) {
03    if(!$class->hasProperty($key)) {
04        throw new Exception($key." is not a valid property");
05    }
06  
07    if(!$class->hasMethod("get".ucfirst($key))) {
08        throw new Exception($key." is missing a getter");
09    }
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   }
32}

有點(diǎn)意思吧。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多