什么叫可變,在程式世界中,可變的當然是變數,常量在定義之后都是不可變的,在程式執行程序中,這個常量都是不能修改的,但是變數卻不同,它們可以修改,那么可變變數和可變函式又是什么意思呢?很明顯,就是用另一個變數來定義他們,這個變數是可變的呀!
可變變數
$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
https://www.php.net/manual/zh/functions.variable-functions.php
關注公眾號:【硬核專案經理】獲取最新文章
添加微信/QQ好友:【xiaoyuezigonggong/149844827】免費得PHP、專案管理學習資料
知乎、公眾號、抖音、頭條搜索【硬核專案經理】
B站ID:482780532
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/253388.html
標籤:PHP
下一篇:python基礎篇之資料型別
