PHP 8.2: ${var} 字符串插入变量解析语法弃用
PHP 支持在双引号和 heredoc 语法的字符串中替换变量值:
$name = 'PHP';
echo "Hello $name"; // Hello PHP
页可以在变量名中使用花括号使之显示更为直观:
$name = 'PHP';
echo "Hello {$name}"; // Hello PHP
虽然上面的两种模式最为重要,PHP 还支持其他两种模式,不过 PHP 8.2 中将会被弃用:
花括号之外的 dollar 符 ($)
PHP 8.2 开始,在花括号外使用 dollar 符 ($) 可能会出现弃用通知:
echo "Hello ${name}";
Deprecated: Using ${var} in strings is deprecated, use {$var} instead in ... on line ...
为了避免出现弃用通知,可以将花括号外面的 $ 符号移到花括号内。这一方式可以横跨 PHP 版本,且不会导致弃用通知。
- echo "Hello ${name}";
+ echo "Hello {$name}";
可变变量或表达式
可变变量是指变量名也是表达式的返回值或者另一个变量的值。PHP 已经对限制了对字符串字面量可变变量的支持。
PHP 8.2 起,当表达式内的花括号用来解析可变变量或表达式时,将 $ 放在花括号外会出现弃用通知。
下面的代码在字符串字面量中使用可变变量:
$name = 'PHP';
$var = 'name';
echo "Hello $$var"; // Hello PHP
echo "Hello {$$var}"; // Hello PHP
上面的示例都不会被弃用,不过在花括号外使用 $ 在 PHP 8.2 会被弃用。比如,下面代码会出现弃用通知:
$name = 'PHP';
$var = 'name';
echo "Hello ${$var}"; // Hello PHP
Deprecated: Using ${expr} (variable variables) in strings is deprecated, use {${expr}} instead in ... on line ...
要避免弃用通知,将在花括号外的 $ 移动到花括号内:
- echo "Hello ${$var}"; // Hello PHP
+ echo "Hello {$$var}"; // Hello PHP
PHP 也支持在字符串字面量中使用表达式,用来解析变量名:
echo "Hello $$object->getMethod()"
类似于可变变量出现弃用通知的例子,在花括号外使用 $ 符也会产生弃用通知:
Deprecated: Using ${expr} (variable variables) in strings is deprecated, use {${expr}} instead in ... on line ...
在表达式外再另外加上一个花括号可以避免弃用通知:
- echo "Hello ${$object->getMethod()}"
+ echo "Hello {${$object->getMethod()}}"
向后兼容性影响
PHP 8.2 弃用了一些使用字面量的模式,可以将 $ 用放在花括号里面。此外,解析变量名的表达式必须将花括号放在表达式外边。
上述的例子在所有的 PHP 版本中都能兼容。
在 PHP 9.0 中,使用弃用的模式将会抛出异常。