编程

PHP 8.2: ${var} 字符串插入变量解析语法弃用

3007 2022-11-21 09:26:10

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 中,使用弃用的模式将会抛出异常。