亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

PHP獲取類私有屬性的3種方法

瀏覽:2日期:2022-09-09 08:33:14

今天在推上看到一條獲取PHP類私有屬性的推文,感覺很有意思:

PHP獲取類私有屬性的3種方法

順著推文聯想,還有其他方式嗎?經過自己的測試及網上答案,總結出三種方法:

1. 反射

反射可以獲取類的詳細信息,要獲取私有屬性的值,只需將對應屬性的ReflectionProperty實例設置為可訪問再取值即可。示例代碼如下:

namespace tlanyan;class Foo { private $bar = 'Foo bar!';}// 獲取反射類及反射屬性$class = new ReflectionClass(Foo::class);$property = $class->getProperty('bar');// 設置屬性可訪問$property->setAccessible(true);$foo = new Foo;// 獲取對象屬性值// 注意:只能通過 ReflectionProperty 實例的 getValue 方法訪問// 不能這樣直接訪問: $foo->bar;echo $property->getValue($foo), PHP_EOL:// 輸出: Foo bar!

本人之前寫過“PHP回顧之反射”一文,比較詳細的介紹了反射及用法,有興趣的閱讀參考。

2. 轉換成數組

這種方法用將對象強制轉換成數組,再通過鍵獲取其值。示例代碼如下:

class Foo { private $bar = 'Foo bar!';}$foo = new Foo;// 強制轉型$attrs = (array)$foo;// 拼接key,注意 '0' 不能改成單引號!$key = '0' . Foo::class . '0' . 'bar';echo $attrs[$key], PHP_EOL;// 輸出: Foo bar!

上述代碼中key的拼接方式比較詭異,key規則如下:

public屬性, key是 屬性名; protected屬性,key是 0*0屬性名; private屬性, key是 0類名0屬性名。

注意 0 是一個字符(不是兩個),對應的ASCII碼是數字0。編程時要用雙引號將其引起來。不能使用單引號,否則轉義失效,那就是兩個字符。如果你有C語言基礎,應該知道 0 就是字符串的結束符。這個符號直接輸出不會顯示,但可以通過strlen或者ord讓其現形:

foreach ($attrs as $key => $value) { echo 'key:$key', ', key length:', strlen($key), ', ascii: '; for ($i = 0; $i < strlen($key); ++ $i) { echo ord($key[$i]), ' '; } echo PHP_EOL;}// 輸出// key:Foobar, key length:8, ascii: 0 70 111 111 0 98 97 114// Foobar 有6個字符,加上兩個不顯示字符,所以長度是8

還需要注意拼接private屬性時類名應該是 “完全限定類名” ,建議通過Foo::class的方式獲取。

與強制轉換成數組類似的另一種方法是serialize,但是serialize比較慢,并且序列化后的字符串更難辨認結構和處理,不建議使用。

3. 閉包

文章開頭的推特截圖已經展示了閉包的用法,其中call方法在PHP7中引入,另一個是PHP5.4引入的bindTo。call和bindTo的用法示例如下:

namespace tlanyan;class Foo { private $bar = 'Foo bar!';}$foo = new Foo;// 閉包(匿名函數)是PHP5.3引入的功能$closure = function() { return $this->bar; };// PHP5.4起支持bindTo方法$method = $closure->bindTo($foo, Foo::class);echo $method(), PHP_EOL;// PHP7引入call方法,可綁定this直接執行echo $closure->call($foo), PHP_EOL;

bindTo方法的第二個參數注意傳入對象的 “完全限定類名”,指示函數應該放置在該類的作用域下,從而可以訪問私有屬性。

總結

性能: 數組 > 反射 > 閉包

易用性: 閉包 > 數組 > 反射

推薦: 閉包 > 反射 > 數組

以上就是PHP獲取類私有屬性的3種方法的詳細內容,更多關于PHP獲取類私有屬性的資料請關注好吧啦網其它相關文章!

標簽: PHP
相關文章:
主站蜘蛛池模板: 香蕉在线播放 | 亚洲第一页在线观看 | 久久精品影视 | 日本黄色录像 | 国产成人三级经典中文 | 免费观看国产 | 9久9久女女免费精品视频在线观看 | 国产尤物视频 | 大尺度做爰床戏呻吟免费观看91 | 91精品国产手机在线版 | 伊人色综合网一区二区三区 | 91久久精品国产91久久性色也 | 草逼的视频 | 日本做爰免费大片视频 | 欧美人成网站免费大全 | 麻豆剧场| 一级黄色片免费播放 | 亚洲国产欧美日韩第一香蕉 | 欧美激情大尺度做爰叫床声 | 久久97久久99久久综合 | 国模双双大尺度炮交g0go | 韩国成人毛片aaa黄 韩国成人在线视频 | 日韩制服丝袜在线观看 | 国产色婷婷精品综合在线观看 | 亚洲一区二区三区免费看 | 国产视频一区二区在线播放 | 欧美一级黄色毛片 | 欧美污污网站 | 国产青榴社区91精品 | 亚洲国产欧美91 | 午夜看一级特黄a大片 | 国产一区二区三区成人久久片 | 免费又色又爽的视频国产 | 欧美日韩国产在线观看一区二区三区 | 亚洲成人免费视频在线 | 日本免费高清一区 | 久热在线视频 | 成人黄色免费网站 | 亚洲欧美日韩精品久久奇米色影视 | 日本69色视频在线观看 | 人妖欧美一区二区三区四区 |