婷婷久久综合九色综合,欧美成色婷婷在线观看视频,偷窥视频一区,欧美日本一道道一区二区

<tt id="bu9ss"></tt>
  • <span id="bu9ss"></span>
  • <pre id="bu9ss"><tt id="bu9ss"></tt></pre>
    <label id="bu9ss"></label>

    當(dāng)前位置:首頁 >  站長 >  編程技術(shù) >  正文

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

     2020-10-30 13:42  來源: 腳本之家   我來投稿 撤稿糾錯(cuò)

      阿里云優(yōu)惠券 先領(lǐng)券再下單

    這篇文章主要介紹了PHP獲取類私有屬性的3種方法,幫助大家更好的理解和使用php,感興趣的朋友可以了解下

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

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

    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的拼接方式比較詭異,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è)不顯示字符,所以長度是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)該放置在該類的作用域下,從而可以訪問私有屬性。

    總結(jié)

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

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

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

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

    來源:腳本之家

    鏈接:https://www.jb51.net/article/195305.htm

    申請(qǐng)創(chuàng)業(yè)報(bào)道,分享創(chuàng)業(yè)好點(diǎn)子。點(diǎn)擊此處,共同探討創(chuàng)業(yè)新機(jī)遇!

    相關(guān)標(biāo)簽
    php教程

    相關(guān)文章

    熱門排行

    信息推薦