PHP的可變變量與可變函數

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

可變變量git

$a = 'hello';

$$a = 'world';

echo $a, ' ', $hello;

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

固然,如下的用法要注意:數組

$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()來實現依賴注入與控制反轉的,這個等咱們未來學習到的時候再說。測試

總結.net

看似很美好很靈活的可變變量與可變函數在咱們實際的開發中卻不多使用。究其緣由固然是可讀性很差,代碼不只是寫給機器的,也是寫給人看的,團隊中人員的水平不齊的話過多的使用這兩種特性會產生很是多的混亂狀況。可是,不少框架代碼中會使用這些特性,因此,這也是咱們向更高層次邁進所必需要掌握的東西。無論怎麼樣,學就是了,能在業務場合中使用可變變量或者函數大大節約代碼量寫出精緻易讀的代碼更能彰顯咱們的技術實力。

測試代碼:
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
https://www.php.net/manual/zh/functions.variable-functions.php

關注公衆號:【硬核項目經理】獲取最新文章

添加微信/QQ好友:【xiaoyuezigonggong/149844827】免費得PHP、項目管理學習資料

知乎、公衆號、抖音、頭條搜索【硬核項目經理】

B站ID:482780532

相關文章
相關標籤/搜索