免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
了解下PHP的Reflection反射機制

PHP5添加了一項新的功能: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

有點不可思議了吧。竟然連注釋都可以取到。

獲取方法(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}

有點意思吧。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
PHP的反射類ReflectionClass、ReflectionMethod使用實例
PHP: Reflection - Manual
Swift 3.0 令人興奮,但Objective-C也有小改進--Objective-C的類屬性
如何利用Python中的@property裝飾器快速重構(gòu)代碼?
【Python之路】特別篇
一步學(xué)會Python高級編程
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服