最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2020年09月10日 08:56:54   作者:tlanyan  
這篇文章主要介紹了PHP獲取類私有屬性的3種方法,幫助大家更好的理解和使用php,感興趣的朋友可以了解下

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

順著推文聯(lián)想,還有其他方式嗎?經(jīng)過自己的測試及網(wǎng)上答案,總結(jié)出三種方法:

1. 反射

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

namespace tlanyan;

class Foo {
 private $bar = "Foo bar!";
}

// 獲取反射類及反射屬性
$class = new \ReflectionClass(Foo::class);
$property = $class->getProperty("bar");
// 設(shè)置屬性可訪問
$property->setAccessible(true);

$foo = new Foo;
// 獲取對象屬性值
// 注意:只能通過 ReflectionProperty 實例的 getValue 方法訪問
// 不能這樣直接訪問: $foo->bar;
echo $property->getValue($foo), PHP_EOL:
// 輸出: Foo bar!

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

2. 轉(zhuǎn)換成數(shù)組

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

class Foo {
 private $bar = "Foo bar!";
}

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

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

  1. public屬性, key是 屬性名;
  2. protected屬性,key是 \0*\0屬性名;
  3. private屬性, key是 \0類名\0屬性名。

注意 \0 是一個字符(不是兩個),對應(yīng)的ASCII碼是數(shù)字0。編程時要用雙引號將其引起來。不能使用單引號,否則轉(zhuǎn)義失效,那就是兩個字符。如果你有C語言基礎(chǔ),應(yīng)該知道 \0 就是字符串的結(jié)束符。這個符號直接輸出不會顯示,但可以通過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屬性時類名應(yīng)該是 “完全限定類名” ,建議通過Foo::class的方式獲取。

與強制轉(zhuǎn)換成數(shù)組類似的另一種方法是serialize,但是serialize比較慢,并且序列化后的字符串更難辨認(rèn)結(jié)構(gòu)和處理,不建議使用。

3. 閉包

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

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ù)應(yīng)該放置在該類的作用域下,從而可以訪問私有屬性。

總結(jié)

性能: 數(shù)組 > 反射 > 閉包

易用性: 閉包 > 數(shù)組 > 反射

推薦: 閉包 > 反射 > 數(shù)組

以上就是PHP獲取類私有屬性的3種方法的詳細(xì)內(nèi)容,更多關(guān)于PHP獲取類私有屬性的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • PHP ajax跨子域的解決方案之document.domain+iframe實例分析

    PHP ajax跨子域的解決方案之document.domain+iframe實例分析

    這篇文章主要介紹了PHP ajax跨子域的解決方案之document.domain+iframe,結(jié)合實例形式分析了PHP ajax跨子域的解決方案document.domain+iframe的基本原理、實現(xiàn)方法與操作注意事項,需要的朋友可以參考下
    2020-03-03
  • 數(shù)據(jù)庫查詢記錄php 多行多列顯示

    數(shù)據(jù)庫查詢記錄php 多行多列顯示

    數(shù)據(jù)庫查詢記錄多行多列顯示,其實是用php生成符合table標(biāo)準(zhǔn)格式的代碼,大家只要對table熟悉下,或?qū)崿F(xiàn)畫好,再生成出代碼,即可。
    2009-08-08
  • php繪制一條弧線的方法

    php繪制一條弧線的方法

    這篇文章主要介紹了php繪制一條弧線的方法,主要涉及GD庫中imagearc方法的使用技巧,需要的朋友可以參考下
    2015-01-01
  • php實現(xiàn)將Session寫入數(shù)據(jù)庫

    php實現(xiàn)將Session寫入數(shù)據(jù)庫

    這篇文章主要介紹了php實現(xiàn)將Session寫入數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下
    2015-07-07
  • Windows下的PHP安裝pear教程

    Windows下的PHP安裝pear教程

    這篇文章主要介紹了Windows下的PHP安裝pear教程,本文在CMD中使用PHP命令安裝pear,不同網(wǎng)上的其他教程,需要的朋友可以參考下
    2014-10-10
  • 8個必備的PHP功能開發(fā)

    8個必備的PHP功能開發(fā)

    這篇文章主要介紹了8個必備的PHP功能開發(fā),需要的朋友可以參考下
    2015-10-10
  • PHP常用字符串函數(shù)用法實例總結(jié)

    PHP常用字符串函數(shù)用法實例總結(jié)

    這篇文章主要介紹了PHP常用字符串函數(shù)用法,結(jié)合實例形式總結(jié)分析了PHP常用字符串函數(shù)基本功能、用法及相關(guān)注意事項,需要的朋友可以參考下
    2020-06-06
  • 帝國cms目錄結(jié)構(gòu)分享

    帝國cms目錄結(jié)構(gòu)分享

    本文給大家分享的是一款非常不錯的也很實用的php的內(nèi)容發(fā)布系統(tǒng)--帝國CMS的目錄結(jié)構(gòu),方便大家進(jìn)行二次開發(fā)。
    2015-07-07
  • php中inlcude()性能對比詳解

    php中inlcude()性能對比詳解

    PHP程序員最常用的兩個函數(shù)莫過于require_once和include了,通過這兩個函數(shù),我們可以使用其他類庫中定義的類等對象。但很多人在使用包含相同目錄下的其他文件時,僅僅簡單使用下面的代碼進(jìn)行文件引用
    2012-09-09
  • PHP 抓取網(wǎng)頁圖片并且另存為的實現(xiàn)代碼

    PHP 抓取網(wǎng)頁圖片并且另存為的實現(xiàn)代碼

    URL是遠(yuǎn)程的完整圖片地址,不能為空, $filename 是另存為的圖片名字 默認(rèn)把圖片放在以此腳本相同的目錄里
    2010-03-03

最新評論

万州区| 宜兴市| 信丰县| 马边| 北安市| 扬州市| 仙居县| 莱西市| 井冈山市| 无锡市| 北辰区| 潞西市| 岗巴县| 黔西县| 乐安县| 通榆县| 曲靖市| 青田县| 昭通市| 孝昌县| 霸州市| 淮阳县| 托克逊县| 浦县| 大城县| 新泰市| 丁青县| 德州市| 昆明市| 乌兰浩特市| 新宁县| 玉门市| 永兴县| 宝鸡市| 朝阳区| 孟津县| 嘉黎县| 合作市| 桐城市| 肥城市| 沈丘县|