將變數的值作為另一個變數的名稱:
<?php
$a = 'hello';
$$a = 'world'; // 等同於 $hello = 'world';
echo "$a ${$a}"; // hello world
echo "$a $hello"; // hello world
// 多層級
$b = 'a';
$$$b = 'test'; // $hello = 'test';
echo $hello; // test
?>
限制:不可用於 $this 與超全域變數($_GET、$_POST 等)。
變數後加括號即視為函數呼叫:
<?php
function foo() { echo "In foo()\n"; }
function bar() { echo "In bar()\n"; }
$func = 'foo';
$func(); // In foo()
$func = 'bar';
$func(); // In bar()
// 類方法
class Test {
public static function staticMethod() { echo "Static\n"; }
public function instanceMethod() { echo "Instance\n"; }
}
$classMethod = ['Test', 'staticMethod'];
$classMethod(); // Static
$obj = new Test();
$instanceMethod = [$obj, 'instanceMethod'];
$instanceMethod(); // Instance
?>
<?php
// $_POST = ['name'=>'John', 'email'=>'john@example.com', 'age'=>'25']
foreach ($_POST as $key => $value) {
$$key = $value; // 自動建立 $name, $email, $age
}
echo "Name: $name, Email: $email, Age: $age";
?>
PHP 允許未宣告變數直接賦值(隱式建立),這與 C#/Java 等強型別語言不同:
<?php
class Demo {
public $name;
public function show() {
echo isset($this->name) ? $this->name : '未設定';
}
}
$obj = new Demo();
$obj->show(); // 未設定
$obj->name = '現在有值了';
$obj->show(); // 現在有值了
?>
注意:雖然方便,但易導致拼字錯誤難以發現。建議開啟 error_reporting(E_ALL) 並配合 IDE 靜態分析。
$GLOBALS、$_SERVER、$_GET、$_POST、$_FILES、$_COOKIE、$_SESSION、$_REQUEST、$_ENV 在所有作用域自動可用。global $var 或 use ($var)(閉包)。