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

PHP獲取類(lèi)私有屬性的3種方法

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

今天在推上看到一條獲取PHP類(lèi)私有屬性的推文,感覺(jué)很有意思:

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

1. 反射

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

namespace tlanyan;

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

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

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

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

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

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

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

$foo = new Foo;
// 強(qiáng)制轉(zhuǎn)型
$attrs = (array)$foo;
// 拼接key,注意 "\0" 不能改成單引號(hào)!
$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類(lèi)名\0屬性名。

注意 \0 是一個(gè)字符(不是兩個(gè)),對(duì)應(yīng)的ASCII碼是數(shù)字0。編程時(shí)要用雙引號(hào)將其引起來(lái)。不能使用單引號(hào),否則轉(zhuǎn)義失效,那就是兩個(gè)字符。如果你有C語(yǔ)言基礎(chǔ),應(yīng)該知道 \0 就是字符串的結(jié)束符。這個(gè)符號(hào)直接輸出不會(huì)顯示,但可以通過(guò)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個(gè)字符,加上兩個(gè)不顯示字符,所以長(zhǎng)度是8

還需要注意拼接private屬性時(shí)類(lèi)名應(yīng)該是 “完全限定類(lèi)名” ,建議通過(guò)Foo::class的方式獲取。

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

3. 閉包

文章開(kāi)頭的推特截圖已經(jīng)展示了閉包的用法,其中call方法在PHP7中引入,另一個(gè)是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方法的第二個(gè)參數(shù)注意傳入對(duì)象的 “完全限定類(lèi)名”,指示函數(shù)應(yīng)該放置在該類(lèi)的作用域下,從而可以訪問(wèn)私有屬性。

總結(jié)

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

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

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

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

相關(guān)文章

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

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

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

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

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

    php繪制一條弧線的方法

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

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

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

    Windows下的PHP安裝pear教程

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

    8個(gè)必備的PHP功能開(kāi)發(fā)

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

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

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

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

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

    php中inlcude()性能對(duì)比詳解

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

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

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

最新評(píng)論

文登市| 合阳县| 景宁| 海南省| 九龙县| 麻城市| 来宾市| 年辖:市辖区| 永平县| 屯门区| 昂仁县| 尼玛县| 寻乌县| 东阳市| 客服| 藁城市| 敖汉旗| 阳朔县| 甘孜县| 江源县| 新和县| 丹巴县| 山西省| 余庆县| 兴城市| 正安县| 藁城市| 宁波市| 高陵县| 娄底市| 习水县| 石棉县| 曲麻莱县| 广东省| 金沙县| 通道| 苍山县| 衡阳县| 静海县| 宝山区| 怀宁县|