站長(zhǎng)資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        解析PHP的可變變量與可變函數(shù)

        什么叫可變。在程序世界中,可變的當(dāng)然是變量。常量在定義之后都是不可變的,在程序執(zhí)行過(guò)程中,這個(gè)常量都是不能修改的。但是變量卻不同,它們可以修改。那么可變變量和可變函數(shù)又是什么意思呢?很明顯,就是用另一個(gè)變量來(lái)定義他們,這個(gè)變量是可變的呀!

        可變變量

        $a = 'hello';  $$a = 'world';  echo $a, ' ', $hello;

        咦,我們沒(méi)有定義$hello這個(gè)變量呀。嗯,從表面上看我們確實(shí)沒(méi)有定義這個(gè)變量,但請(qǐng)注意這個(gè)$$符號(hào)。$符號(hào)的意思就是定義變量,當(dāng)我們?cè)谝粋€(gè)$符號(hào)后面跟上一個(gè)已經(jīng)定義的變量名,那么這個(gè)變量的內(nèi)容就成為了新的變量名。也就是說(shuō),$a的內(nèi)容hello成為了一個(gè)新的變量名叫$hello,然后給它賦值為world。是不是感覺(jué)不太好理解,也不便于我們查看代碼,這個(gè)問(wèn)題我們最后再說(shuō)。

        當(dāng)然,以下的用法要注意:

        $a = 1; $$a = 2;  echo $1; // Parse error: syntax error, unexpected '1' echo ${1}; // ok  $a = ['b', 'c', 'd']; $$a = 'f';  echo $b, $c, $d;
        • 數(shù)字類(lèi)型不是合法的變量名,不能作為可變變量被定義
        • 但是利用{},是可以輸出的,{}會(huì)獲取{}內(nèi)部的值并作為一個(gè)變量來(lái)解析,這里的{1}我們利用可變變量賦值成為了一個(gè)變量,直接輸出是非常的,但放在{1}中就成為了一個(gè)可解析的變量名,我們可以簡(jiǎn)單的理解為{1}轉(zhuǎn)換成了$'1',成為了一個(gè)正式的變量名
        • 數(shù)組當(dāng)然是不行啦
        • 它們這樣寫(xiě)都是不會(huì)報(bào)錯(cuò)的

        使用對(duì)象就不行了,直接就會(huì)報(bào)錯(cuò)了,對(duì)象是不能進(jìn)行可變變量的操作的。

        class A {} class B extends A {}  $a = new A(); $$a = new B(); // Catchable fatal error: Object of class A could not be converted to string

        可變函數(shù)

        可變函數(shù)其實(shí)也大同小異,當(dāng)我們?cè)谝粋€(gè)變量的后面加上()時(shí),PHP就會(huì)嘗試將這個(gè)變量當(dāng)做函數(shù)來(lái)解析。

        function testA() {     echo "testA"; }  $a = 'testA'; $a(); // testA

        可變變量是將一個(gè)字符串轉(zhuǎn)換成了一個(gè)變量名,而可變函數(shù)則是將一個(gè)字符串當(dāng)做函數(shù)名來(lái)調(diào)用。比如類(lèi)中的方法,我們可以這樣來(lái)調(diào)用:

        class C {     public function testA()     {         echo "C:testA";     }     public function testB()     {         echo "C:testB";     }     public function testC()     {         echo "C:testC";     } }  $funcs = ['testA', 'testB', 'testC'];  $c = new C(); foreach ($funcs as $func) {     $c->$func(); }

        可變函數(shù)的這種特性和另外兩個(gè)系統(tǒng)函數(shù)的關(guān)系非常緊密,它們是:call_user_func()和call_user_func_array(),Laravel中服務(wù)容器的核心實(shí)現(xiàn)就是使用了call_user_func_array()來(lái)實(shí)現(xiàn)依賴注入與控制反轉(zhuǎn)的,這個(gè)等我們將來(lái)學(xué)習(xí)到的時(shí)候再說(shuō)。

        總結(jié)

        看似很美好很靈活的可變變量與可變函數(shù)在我們實(shí)際的開(kāi)發(fā)中卻很少使用。究其原因當(dāng)然是可讀性不好,代碼不僅是寫(xiě)給機(jī)器的,也是寫(xiě)給人看的,團(tuán)隊(duì)中人員的水平不齊的話過(guò)多的使用這兩種特性會(huì)產(chǎn)生非常多的混亂情況。但是,很多框架代碼中會(huì)使用這些特性,所以,這也是我們向更高層次邁進(jìn)所必須要掌握的東西。不管怎么樣,學(xué)就是了,能在業(yè)務(wù)場(chǎng)合中使用可變變量或者函數(shù)大大節(jié)約代碼量寫(xiě)出精致易讀的代碼更能彰顯我們的技術(shù)實(shí)力。

        測(cè)試代碼: https://github.com/zhangyue0503/dev-blog/blob/master/php/201911/source/PHP%E7%9A%84%E5%8F%AF%E5%8F%98%E5%8F%98%E9%87%8F%E4%B8%8E%E5%8F%AF%E5%8F%98%E5%87%BD%E6%95%B0.php

        參考鏈接:
        https://www.php.net/manual/zh/language.variables.variable.php(推薦:《PHP視頻教程》)

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
        主站蜘蛛池模板: 精品免费视在线观看| 国产AV国片精品| 久久精品视频网| 91麻豆精品视频| 精品国产美女福利到在线不卡| 国产精品久久永久免费| 凹凸69堂国产成人精品视频| 国产高清在线精品二区一| 亚洲国产精品久久久久久| 国产精品亚洲欧美大片在线看| 日韩欧美国产精品第一页不卡| 国产午夜精品理论片久久影视| 欧美精品1区2区| 国产精品v欧美精品v日韩 | 久久久久亚洲精品男人的天堂| 国产福利电影一区二区三区,亚洲国模精品一区 | 亚洲愉拍99热成人精品热久久| 久久综合精品国产二区无码| 国产亚洲精品a在线无码| 亚洲精品欧美综合在线| 久久精品国产福利国产琪琪| 久久精品蜜芽亚洲国产AV| 四虎国产精品免费观看| 蜜臀AV无码国产精品色午夜麻豆| 精品国产v无码大片在线观看| 97视频在线精品国自产拍 | 国产精品嫩草影院久久| 亚洲精品国产美女久久久| 日韩精品免费视频| 热re99久久6国产精品免费| 国内精品久久久久久野外| 亚洲精品乱码久久久久久蜜桃图片| 中文字幕精品一区影音先锋| 亚洲国产另类久久久精品| 大胸国产精品视频| 99在线精品一区二区三区| 中文国产成人精品久久不卡| 欧美精品国产日韩综合在线| 久久精品午夜一区二区福利| 亚洲AⅤ永久无码精品AA| 国产乱码精品一区二区三|