站長資訊網
最全最豐富的資訊網站

解析PHP的可變變量與可變函數

什么叫可變。在程序世界中,可變的當然是變量。常量在定義之后都是不可變的,在程序執行過程中,這個常量都是不能修改的。但是變量卻不同,它們可以修改。那么可變變量和可變函數又是什么意思呢?很明顯,就是用另一個變量來定義他們,這個變量是可變的呀!

可變變量

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

咦,我們沒有定義$hello這個變量呀。嗯,從表面上看我們確實沒有定義這個變量,但請注意這個$$符號。$符號的意思就是定義變量,當我們在一個$符號后面跟上一個已經定義的變量名,那么這個變量的內容就成為了新的變量名。也就是說,$a的內容hello成為了一個新的變量名叫$hello,然后給它賦值為world。是不是感覺不太好理解,也不便于我們查看代碼,這個問題我們最后再說。

當然,以下的用法要注意:

$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;
  • 數字類型不是合法的變量名,不能作為可變變量被定義
  • 但是利用{},是可以輸出的,{}會獲取{}內部的值并作為一個變量來解析,這里的{1}我們利用可變變量賦值成為了一個變量,直接輸出是非常的,但放在{1}中就成為了一個可解析的變量名,我們可以簡單的理解為{1}轉換成了$'1',成為了一個正式的變量名
  • 數組當然是不行啦
  • 它們這樣寫都是不會報錯的

使用對象就不行了,直接就會報錯了,對象是不能進行可變變量的操作的。

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

可變函數

可變函數其實也大同小異,當我們在一個變量的后面加上()時,PHP就會嘗試將這個變量當做函數來解析。

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

可變變量是將一個字符串轉換成了一個變量名,而可變函數則是將一個字符串當做函數名來調用。比如類中的方法,我們可以這樣來調用:

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(); }

可變函數的這種特性和另外兩個系統函數的關系非常緊密,它們是:call_user_func()和call_user_func_array(),Laravel中服務容器的核心實現就是使用了call_user_func_array()來實現依賴注入與控制反轉的,這個等我們將來學習到的時候再說。

總結

看似很美好很靈活的可變變量與可變函數在我們實際的開發中卻很少使用。究其原因當然是可讀性不好,代碼不僅是寫給機器的,也是寫給人看的,團隊中人員的水平不齊的話過多的使用這兩種特性會產生非常多的混亂情況。但是,很多框架代碼中會使用這些特性,所以,這也是我們向更高層次邁進所必須要掌握的東西。不管怎么樣,學就是了,能在業務場合中使用可變變量或者函數大大節約代碼量寫出精致易讀的代碼更能彰顯我們的技術實力。

測試代碼: 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)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
亚洲一区无码精品色| 国产日韩精品视频| 久久99热精品免费观看牛牛| 精品人妻少妇一区二区| 日韩福利电影在线观看| 国产成人麻豆精品午夜福利在线| 久久亚洲精品无码网站| 91精品国产自产在线观看| 无码久久精品国产亚洲Av影片| 亚洲色精品88色婷婷七月丁香| 精品国产一区二区三区在线观看| 久青草中文字幕精品视频| 久久久久久久久无码精品亚洲日韩 | 久夜色精品国产一区二区三区| 亚洲区日韩精品中文字幕| 国产在线精品一区二区在线看| 国内成人精品亚洲日本语音| 天堂一区二区三区精品| 国产成人精品久久亚洲高清不卡| 久久精品中文字幕大胸| 最新在线精品国自产拍网站| 国产香蕉精品视频| 国产精品亚洲片在线va| 日本亚洲精品色婷婷在线影院| 久久国语露脸国产精品电影| 亚洲精品福利网泷泽萝拉| 麻豆国产精品无码视频| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 国产美女久久精品香蕉69| 国产免费阿v精品视频网址| 中文字幕精品久久| 国产午夜亚洲精品午夜鲁丝片 | 精品国产乱码久久久久久人妻| 911精品国产亚洲日本美国韩国| 精品无码av一区二区三区| 久视频精品免费观看99| 国产成人亚洲精品| 呦交小u女国产精品视频| 国产精品人人妻人人爽| 国产精品毛片在线完整版| 国产伦精品一区二区三区在线观看|