新聞中心
這期內容當中小編將會給大家?guī)碛嘘PPHP中獲取類私有屬性的方法有哪些,文章內容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
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. 轉換成數(shù)組
這種方法用將對象強制轉換成數(shù)組,再通過鍵獲取其值。示例代碼如下:
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規(guī)則如下:
public
屬性, key是 屬性名;protected
屬性,key是 \0*\0屬性名;private
屬性, key是 \0類名\0屬性名。
注意 \0 是一個字符(不是兩個),對應的ASCII碼是數(shù)字0。編程時要用雙引號將其引起來。不能使用單引號,否則轉義失效,那就是兩個字符。如果你有C語言基礎,應該知道 \0 就是字符串的結束符。這個符號直接輸出不會顯示,但可以通過strlen
或者ord
讓其現(xiàn)形:
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
的方式獲取。
與強制轉換成數(shù)組類似的另一種方法是serialize
,但是serialize
比較慢,并且序列化后的字符串更難辨認結構和處理,不建議使用。
3. 閉包
文章開頭的推特截圖已經展示了閉包的用法,其中call
方法在PHP7中引入,另一個是PHP5.4引入的bindTo
。call
和bindTo
的用法示例如下:
namespace tlanyan; class Foo { private $bar = "Foo bar!"; } $foo = new Foo; // 閉包(匿名函數(shù))是PHP5.3引入的功能 $closure = function() { return $this->bar; }; // PHP5.4起支持bindTo方法 $method = $closure->bindTo($foo, Foo::class); echo $method(), PHP_EOL; // PHP7引入call方法,可綁定this直接執(zhí)行 echo $closure->call($foo), PHP_EOL;
bindTo
方法的第二個參數(shù)注意傳入對象的 “完全限定類名”,指示函數(shù)應該放置在該類的作用域下,從而可以訪問私有屬性。
總結
性能: 數(shù)組 > 反射 > 閉包
易用性: 閉包 > 數(shù)組 > 反射
推薦: 閉包 > 反射 > 數(shù)組
上述就是小編為大家分享的PHP中獲取類私有屬性的方法有哪些了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
分享名稱:PHP中獲取類私有屬性的方法有哪些-創(chuàng)新互聯(lián)
轉載來于:http://www.ef60e0e.cn/article/dghpid.html