成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

深入了解PHP中的反射機制

本篇文章給大家詳細介紹一下PHP中的反射機制。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。

深入了解PHP中的反射機制

PHP的反射機制提供了一套反射API,用來訪問和使用類、方法、屬性、參數和注釋等,比如可以通過一個對象知道這個對象所屬的類,這個類包含哪些方法,這些方法需要傳入什么參數,每個參數是什么類型等等,不用創建類的實例也可以訪問類的成員和方法,就算類成員定義為 private也可以在外部訪問。

官方文檔提供了諸如 ReflectionClass、ReflectionMethod、ReflectionObject、ReflectionExtension 等反射類及相應的API,用得最多的是 ReflectionClass

為了演示反射效果,首先創建一個類(假設定義了一個類 User),并實例化。基于這個實例,反射類可以訪問 User 中的屬性和方法。

<?php /**  * 用戶相關類  */ class User {     public $username;     private $password;      public function __construct($username, $password)     {         $this->username = $username;         $this->password = $password;     }      /**      * 獲取用戶名      * @return string      */     public function getUsername()     {         return $this->username;     }      /**      * 設置用戶名      * @param string $username      */     public function setUsername($username)     {         $this->username = $username;     }      /**      * 獲取密碼      * @return string      */     private function getPassword()     {         return $this->password;     }      /**      * 設置密碼      * @param string $password      */     private function setPassowrd($password)     {         $this->password = $password;     } }

創建反射類實例

$refClass = new ReflectionClass(new User('liulu', '123456'));  // 也可以寫成  $refClass = new ReflectionClass('User'); // 將類名User作為參數,建立User類的反射類

反射屬性

$properties = $refClass->getProperties(); // 獲取User類的所有屬性,返回ReflectionProperty的數組 $property = $refClass->getProperty('password'); // 獲取User類的password屬性 //$properties 結果如下: Array (    [0] => ReflectionProperty Object ( [name] => username [class] => User )    [1] => ReflectionProperty Object ( [name] => password [class] => User ) )    //$property 結果如下: ReflectionProperty Object ( [name] => password [class] => User )

反射方法

$methods = $refClass->getMethods(); // 獲取User類的所有方法,返回ReflectionMethod數組 $method = $refClass->getMethod('getUsername');  // 獲取User類的getUsername方法  //$methods 結果如下: Array (     [0] => ReflectionMethod Object ( [name] => __construct [class] => User )     [1] => ReflectionMethod Object ( [name] => getUsername [class] => User )     [2] => ReflectionMethod Object ( [name] => setUsername [class] => User )     [3] => ReflectionMethod Object ( [name] => getPassword [class] => User )     [4] => ReflectionMethod Object ( [name] => setPassowrd [class] => User ) ) //$method 結果如下: ReflectionMethod Object ( [name] => getUsername [class] => User )

反射注釋

$classComment = $refClass->getDocComment();  // 獲取User類的注釋文檔,即定義在類之前的注釋 $methodComment = $refClass->getMethod('setPassowrd')->getDocComment();  // 獲取User類中setPassowrd方法的注釋 //$classComment 結果如下: /** * 用戶相關類 */ //$methodComment 結果如下: /** * 設置密碼 * @param string $password */

反射實例化

$instance = $refClass->newInstance('admin', 123, '***');  // 從指定的參數創建一個新的類實例 //$instance 結果如下: User Object ( [username] => admin [password:User:private] => 123 ) 注:雖然構造函數中是兩個參數,但是newInstance方法接受可變數目的參數,用于傳遞到類的構造函數。   $params = ['xiaoming', 'asdfg']; $instance = $refClass->newInstanceArgs($params); // 從給出的參數創建一個新的類實例 //$instance 結果如下: User Object ( [username] => xiaoming [password:User:private] => asdfg )

訪問、執行類的公有方法——public

$instance->setUsername('admin_1'); // 調用User類的實例調用setUsername方法設置用戶名 $username = $instance->getUsername(); // 用過User類的實例調用getUsername方法獲取用戶名 echo $username . "n"; // 輸出 admin_1  // 也可以寫成 $refClass->getProperty('username')->setValue($instance, 'admin_2'); // 通過反射類ReflectionProperty設置指定實例的username屬性值 $username = $refClass->getProperty('username')->getValue($instance); // 通過反射類ReflectionProperty獲取username的屬性值 echo $username . "n"; // 輸出 admin_2  // 還可以寫成 $refClass->getMethod('setUsername')->invoke($instance, 'admin_3'); // 通過反射類ReflectionMethod調用指定實例的方法,并且傳送參數 $value = $refClass->getMethod('getUsername')->invoke($instance); // 通過反射類ReflectionMethod調用指定實例的方法 echo $value . "n"; // 輸出 admin_3

訪問、執行類的非公有方法——private、protected

try {     // 正確寫法     $property = $refClass->getProperty('password'); // ReflectionProperty Object ( [name] => password [class] => User )     $property->setAccessible(true); // 修改 $property 對象的可訪問性     $property->setValue($instance, '987654321'); // 可以執行     $value = $property->getValue($instance); // 可以執行     echo $value . "n";   // 輸出 987654321      // 錯誤寫法     $refClass->getProperty('password')->setAccessible(true); // 臨時修改ReflectionProperty對象的可訪問性     $refClass->getProperty('password')->setValue($instance, 'password'); // 不能執行,拋出不能訪問異常     $refClass = $refClass->getProperty('password')->getValue($instance); // 不能執行,拋出不能訪問異常     $refClass = $instance->password;   // 不能執行,類本身的屬性沒有被修改,仍然是private } catch (Exception $e){     echo $e; }  // 錯誤寫法 結果如下: ReflectionException: Cannot access non-public member User::password in xxx.php

小結

不管反射類中定義的屬性、方法是否為 public,都可以獲取到。 直接訪問 protected 或則 private 的屬性、方法,會拋出異常。 訪問非公有成員需要調用指定的 ReflectionPropertyReflectionMethod 對象 setAccessible(true)方法。

推薦學習:《PHP視頻教程》

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
亚洲成A人片在线观看无码3D | 91人妻一区二区三区蜜桃 | 大欧派拔萝卜游戏| 国产成人无码国产亚洲| 国产精品毛片VA一区二区三区 | А√天堂资源在线官网| 岛国精品一区免费视频在线| 国产精品国产三级国产AV麻豆| 国产啪精品视频网站免费尤物| 精品久久人人爽人人玩人人妻| 久久亚洲精品综合国产仙踪林| 免费女同毛片在线播放| 人妻丰满熟妇岳AV无码区HD| 四虎成人精品一区二区免费网站| 性色AV 一区二区三区| 亚洲日韩国产一区二区蜜桃| 97久久超碰国产精品2021| 成人精品一区二区三区在线观看 | PYTHON人马大战| 国产 麻豆 日韩 欧美 久久| 国内精品乱码卡一卡2卡麻豆| 久久久人人人婷婷色东京热| 欧美性白人极品1819HD| 撕开奶罩揉吮奶头免费视频| 亚洲乱人伦中文字幕无码| 中文字幕人成无码人妻| 成人免费区一区二区三区| 国产微拍精品一区二区| 老牛aV无码一区二区人妻| 日本免费人成视频在线观看| 亚州少妇无套内射激情视频| 中国CHINAGARY武警网站| 差差差很疼APP大全免费下载软| 国产美女被遭强高潮网站免费 | 亚洲中文字幕无码AV永久| 99精品国产再热久久无毒不卡 | 久久国产精品二国产精品| 区产品乱码芒果精品P站| 午夜无码一区二区三区在线| 在线天堂中文最新版WWW| 炖肉计(是今)海棠| 久久97人人超人人超碰超国产| 欧美一区二区放荡人妇| 羞羞午夜爽爽爽爱爱爱爱人人人| 中国老太太WBBHD| 国产AV无码专区影视| 久久久久国产亚洲AⅤ麻豆| 日本三级香港三级人妇99| 亚洲精品乱码久久久久久中文字幕 | 人人妻人人爽人人爽| 亚洲国产AV无码专区亚洲AVL| BTА√天堂中文在线官网| 国产啪亚洲国产精品无码| 女人收缩时男人舒服吗| 亚洲AV成人无码AV小说| AV无码专区亚洲AVL在线观看| 国内精品久久久久影院一蜜桃| 欧美顶级METART裸体全部自慰| 无码A级毛片免费视频内谢5J| 中文字幕精品亚洲人成在线 | 久久亚洲中文字幕精品一区| 四虎一区二区成人免费影院网址| 永久免费AⅤ无码网站国产| 国产成人亚洲精品无码青| 末成年女AV片一区二区丫| 亚洲 校园 欧美 国产 另类 | 伊人天天久大香线蕉AV色| 国产福利一区二区久久| 男人的天堂AV网站| 亚洲不卡无码A∨在线| 成人精品老熟妇一区二区| 久久亚洲精品综合国产仙踪林| 无码国产偷倩在线播放| FREE性欧美HD另类精品| 久久成人无码专区| 翁止熄痒苏钥第9章的内容| 99久久国产综合精麻豆| 精品人妻系列无码人妻在线不 | 欧美人C交ZOOZOOXX| 亚洲VA韩国VA欧美VA| 丰满大屁股熟女偷拍内射| 内射老妇女BBWXOGOD| 亚洲国产精品无码久久青草 | AV老司机福利精品导航| 久久99精品国产麻豆宅宅| 无码人妻精品一区二区三区99不卡| S货叫大点声C烂你的SB| 久久久久人妻一区精品色 | 国产在线码观看超清无码视频| 日本亚洲色大成网站www久久| 制服中字人妻中字出轨中字| 精品久久久久久人妻无码中文字幕 | 亚洲AV无码一区二区三区18 | HD专干中国老太婆| 久久综合九色综合欧美婷婷| 亚洲成AV人片无码BT种子下载| 春色精品久久久久午夜aⅴ| 女高中生自慰污污网站| 野花视频大全高清免费| 狠狠躁天天躁日日躁欧美| 无码人妻aⅴ一区二区三区99 | 日本伊人精品一区二区三区| 7777久久亚洲中文字幕蜜桃| 久久人人做人人爽人人AV| 亚洲国产精品成人一区二区在线| 国产精品久久婷婷六月丁香| 色翁荡息又大又硬又粗视频| 啊灬啊灬啊灬快灬深视频无遮掩 | 欧美巨大巨粗黑人性AAAAAA| 与大屁股熟女啪啪喷水| 精品熟妇无码av免费久久| 亚洲AV无码久久精品狠狠爱浪潮 | 成年女人毛片视频免费| 欧美性一区二区三区| 777爽死你免费看一二区无码| 老师你的兔子好软水好多的图片 | 国产福利无码一区在线| 少妇又色又紧又爽又刺激视频| 超碰97人人射妻| 日本喷奶水中文字幕视频| XXXX18HD亚洲HD护士| 欧美三级一区二区| 99久久精品美女高潮喷水| 男女后进式猛烈XX00动态图片| 在线观看无码AV网址| 旧芭乐视频官网下载地址IOS| 亚洲熟妇无码久久精品导航| 精品无码国产自产拍在线观看蜜| 亚洲国产欧美在线人成| 精品国产一二三产品区别在哪| 亚洲成在人线AV中文字幕喷水| 狠狠人妻熟妇Av又粗又大| 亚洲国产成人精品无码区花野真一| 国色天香卡一卡二乱码| 亚洲AV素人乱码| 精品国产青草久久久久福利| 亚洲日韩VA无码中文字幕| 久久久国产精品ⅤA麻豆LL| 亚洲综合久久一区二区| 久久综合色一综合色88| 中文字幕V亚洲ⅤV天堂| 女人越喊男人越往里寨电视剧| av 成人 亚洲无码| 人妻无码一区二区19P| 成人无码免费视频在线观看网址 | AV无码久久久久不卡网站蜜桃| 欧美狂野乱码一二三四区| H精品无码动漫在线观看| 人妻少妇aB又紧又爽精品视频| 成人AV无码乱码在线观看无码| 十八禁无码精品A∨在线观看| 国产精品美女久久久网站| 亚洲AV综合色区无码三区30p| 精品无码国产污污污免费| 永久939W79W99W乳液| 男人边吃奶边揉好爽免费视频| 白人极品少妇XXXⅩ做受| 天堂8А√中文在线官网| 国产艳妇AV在线出轨| 亚洲欧美中文日韩V在线观看| 久久综合精品国产二区无码| 99精品久久久久精品双飞| 日产精品久久久一区二区| 国产精品免费无遮挡无码永久视频| 亚洲AV午夜国产精品无码中文字| 久久久久久精品成人网站| 99热最新成人国产精品| 色噜噜狠狠色综合久色AⅤ网视频| 国产乱码一卡二卡3卡4卡网站| 亚洲欧美偷国产日韩| 男人J放进女人P全黄动态图| 被蹂躏的她 电影| 性欧美18ⅩXOO极品FREE| 久久久久国产亚洲AⅤ麻豆| AV无码免费无禁网站| 婷婷丁香五月深爱憿情网| 精品国产一区二区三区性色AV| 中文字幕无码精品三级在线电影| 人妻少妇中文字幕| 国产免费永久精品无码| 一区二区av在线| 日本亚洲色欲网站WWW| 国产专区一线二线三线品牌东 | 亚洲AV无码专区在线观看成人| 老色鬼永久精品网站| 大香煮伊在2020一二三久| 亚洲AV无码国产剧情| 麻豆人妻少妇精品无码专区2| 差差差很疼30分钟的视频| 亚洲成AV人片不卡无苍井空| 欧美ZC0O人与善交的最新章节| 国产精品99久久久久久猫咪| 一边做饭一边暴躁怎么办| 日韩少妇内射免费播放| 精品国产制服丝袜高跟 | 欧美最猛黑人XXXⅩ猛男视频| 国产老熟女精品一区熟女AV| 在线天堂资源WWW在线中文| 视频一区二区三区在线观看蜜桃 | A级无遮挡超级高清-在线观看|