按名稱動態訪問變數(變數變數)
可以通過動態變數名訪問變數。變數的名稱可以儲存在另一個變數中,允許動態訪問它。這些變數稱為變數變數。
要將變數轉換為變數變數,可以在變數前放置一個額外的 $
。
$variableName = 'foo';
$foo = 'bar';
// The following are all equivalent, and all output "bar":
echo $foo;
echo ${$variableName};
echo $$variableName;
//similarly,
$variableName = 'foo';
$$variableName = 'bar';
// The following statements will also output 'bar'
echo $foo;
echo $$variableName;
echo ${$variableName};
變數變數對於對映函式/方法呼叫很有用:
function add($a, $b) {
return $a + $b;
}
$funcName = 'add';
echo $funcName(1, 2); // outputs 3
這在 PHP 類中特別有用:
class myClass {
public function __construct() {
$functionName = 'doSomething';
$this->$functionName('Hello World');
}
private function doSomething($string) {
echo $string; // Outputs "Hello World"
}
}
有可能,但不要求將 $variableName
放在 {}
之間:
${$variableName} = $value;
以下示例都是等效的並輸出 baz
:
$fooBar = 'baz';
$varPrefix = 'foo';
echo $fooBar; // Outputs "baz"
echo ${$varPrefix . 'Bar'}; // Also outputs "baz"
僅當變數的名稱本身是表示式時才使用 {}
,如下所示:
${$variableNamePart1 . $variableNamePart2} = $value;
儘管如此,建議始終使用 {}
,因為它更具可讀性。
雖然不建議這樣做,但可以連結此行為:
$$$$$$$$DoNotTryThisAtHomeKids = $value;
值得注意的是,許多開發人員認為過度使用變數變數是一種不好的做法。由於它們不適合現代 IDE 的靜態分析,因此具有許多變數(或動態方法呼叫)的大型程式碼庫很快就難以維護。
PHP5 和 PHP7 之間的差異
始終使用 {}
或 ()
的另一個原因是 PHP5 和 PHP7 處理動態變數的方式略有不同,這在某些情況下會導致不同的結果。
在 PHP7 中,動態變數,屬性和方法現在將嚴格按照從左到右的順序進行評估,而不是 PHP5 中特殊情況的混合。以下示例顯示評估順序如何變化。
案例 1:$$foo['bar']['baz']
- PHP5 解讀:
${$foo['bar']['baz']}
- PHP7 解讀:
($$foo)['bar']['baz']
案例 2:$foo->$bar['baz']
- PHP5 解讀:
$foo->{$bar['baz']}
- PHP7 解讀:
($foo->$bar)['baz']
案例 3:$foo->$bar['baz']()
- PHP5 解讀:
$foo->{$bar['baz']}()
- PHP7 解讀:
($foo->$bar)['baz']()
案例 4:Foo::$bar['baz']()
- PHP5 解讀:
Foo::{$bar['baz']}()
- PHP7 解讀:
(Foo::$bar)['baz']()