溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP中怎么獲取類私有屬性

發(fā)布時(shí)間:2021-06-30 16:48:48 來源:億速云 閱讀:169 作者:Leah 欄目:編程語言

本篇文章為大家展示了PHP中怎么獲取類私有屬性,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

  PHP獲取類私有屬性的方式

  1. 反射

  反射可以獲取類的詳細(xì)信息,要獲取私有屬性的值,只需將對(duì)應(yīng)屬性的ReflectionProperty實(shí)例設(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;

  // 獲取對(duì)象屬性值

  // 注意:只能通過 ReflectionProperty 實(shí)例的 getValue 方法訪問

  // 不能這樣直接訪問: $foo->bar;

  echo $property->getValue($foo), PHP_EOL:

  // 輸出: Foo bar!

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

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

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

  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的拼接方式比較詭異,根據(jù)鳥哥“深入理解PHP原理之對(duì)象(一)”文中的信息,key規(guī)則如下:

  public屬性, key是 屬性名;

  protected屬性,key是 \0*\0屬性名;

  private屬性, key是 \0類名\0屬性名。

  注意 \0 是一個(gè)字符(不是兩個(gè)),對(duì)應(yīng)的ASCII碼是數(shù)字0。編程時(shí)要用雙引號(hào)將其引起來。不能使用單引號(hào),否則轉(zhuǎn)義失效,那就是兩個(gè)字符。如果你有C語言基礎(chǔ),應(yīng)該知道 \0 就是字符串的結(jié)束符。這個(gè)符號(hào)直接輸出不會(huì)顯示,但可以通過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í)類名應(yīng)該是 “完全限定類名” ,建議通過Foo::class的方式獲取。   與強(qiáng)制轉(zhuǎn)換成數(shù)組類似的另一種方法是serialize,但是serialize比較慢,并且序列化后的字符串更難辨認(rèn)結(jié)構(gòu)和處理,不建議使用。   3. 閉包   文章開頭的推特截圖已經(jīng)展示了閉包的用法,其中call方法在PHP7中引入,另一個(gè)是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方法的第二個(gè)參數(shù)注意傳入對(duì)象的 “完全限定類名”,指示函數(shù)應(yīng)該放置在該類的作用域下,從而可以訪問私有屬性。

上述內(nèi)容就是PHP中怎么獲取類私有屬性,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI