欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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ù)組

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

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

$foo = new Foo;
// 強(qiáng)制轉(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的方式獲取。

與強(qiáng)制轉(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實現(xiàn)數(shù)據(jù)庫的增刪改查

    php實現(xiàn)數(shù)據(jù)庫的增刪改查

    本文給大家介紹的是PHP連接數(shù)據(jù)庫以及實現(xiàn)數(shù)據(jù)庫的增刪改查功能的方法及示例代碼,希望對大家學(xué)習(xí)php能夠有所幫助
    2017-02-02
  • 理解php Hash函數(shù),增強(qiáng)密碼安全

    理解php Hash函數(shù),增強(qiáng)密碼安全

    服務(wù)器和數(shù)據(jù)庫的資料偶爾會被竊取,因此需要保證發(fā)生這種情況時一些重要的用戶數(shù)據(jù),比如密碼,是別人無法獲取的。這里我們將要討論Hash的原理,以及它是如何保護(hù)Web應(yīng)用程序中的密碼安全的。
    2011-02-02
  • PHP 可閱讀隨機(jī)字符串代碼

    PHP 可閱讀隨機(jī)字符串代碼

    此代碼將創(chuàng)建一個可閱讀的字符串,使其更接近詞典中的單詞,實用且具有密碼驗證功能。
    2010-05-05
  • PHP源代碼數(shù)組統(tǒng)計count分析

    PHP源代碼數(shù)組統(tǒng)計count分析

    偶然在百度知道中看到有個同學(xué)問起count及strlen的效率問題,好吧這個問題我當(dāng)初沒理解透徹,認(rèn)為其不屬兩個不一樣的東西不可比較,后來看了樓主的回復(fù)才反應(yīng)過來,所以自己也去找了下源碼查看下?,F(xiàn)在總結(jié)下查看到的結(jié)果并記錄之。
    2011-08-08
  • Zend Framework中的簡單工廠模式 圖文

    Zend Framework中的簡單工廠模式 圖文

    某天又然后想到好久沒復(fù)習(xí)設(shè)計模式了。綜合一下,復(fù)習(xí)一個設(shè)計模式之后在ZF中找一下使用這模式的源碼吧,不讀所有源碼,讀讀比較”高級”的部分吧,要說模式,暫時不知道是不是所有模式ZF里面都有,但是應(yīng)該有足夠的模式夠我最近看了,在說可以找找其他開源的軟件來找模式
    2012-07-07
  • PHP編碼規(guī)范-php coding standard

    PHP編碼規(guī)范-php coding standard

    標(biāo)準(zhǔn)化問題在某些方面上讓每個人頭痛,讓人人都覺得大家處于同樣的境地。這有助于讓這些建議在許多的項目中不斷演進(jìn),許多公司花費了許多星期逐子字逐句的進(jìn)行爭論。
    2007-03-03
  • 詳解PHP中array_rand函數(shù)的使用方法

    詳解PHP中array_rand函數(shù)的使用方法

    大家都知道array_rand是數(shù)組隨機(jī)函數(shù)了,今天看到一個站長簡單的介紹array_rand性能了,于是把許久沒寫的php再來簡單的看看,我們一起來看看array_rand函數(shù)用法吧。有需要的朋友們可以參考學(xué)習(xí)。
    2016-09-09
  • php swoft框架實例用法

    php swoft框架實例用法

    在本篇文章里小編給大家分享了一篇關(guān)于php swoft框架實例用法,有需要的朋友們可以學(xué)習(xí)參考下。
    2020-12-12
  • PHP隊列用法實例

    PHP隊列用法實例

    這篇文章主要介紹了PHP隊列用法,以實例形式詳細(xì)講述了PHP隊列的實現(xiàn)與各種常用的操作,非常具有參考借鑒價值,需要的朋友可以參考下
    2014-11-11
  • php 生成短網(wǎng)址原理及代碼

    php 生成短網(wǎng)址原理及代碼

    將原網(wǎng)址做crc32校驗,得到校驗碼,使用sprintf將校驗碼轉(zhuǎn)為無符號數(shù)字,詳細(xì)步驟請看本文
    2014-01-01

最新評論