PHP 8.2 弃用通过 ${} 在字符串插入变量语法


PHP 社区 4 月底通过了一项只有一张反对票的提案,提案内容是在即将发布的 PHP 8.2 中,不再支持使用 ${} 在字符串中插入变量的语法(标记为弃用状态),并在 PHP 9 删除该语法。 目前 PHP 可通过以下方式在带有双引号 (")和 heredoc 的字符串中插入变量。
  1. 直接插入变量: “$foo”
  2. 在变量外添加花括号: “{$foo}”
  3. 在 $ 符号后面添加花括号: “${foo}”
  4. 定义可变的变量语法 ( “${expr}”,等同于 (string) ${expr}
提交该提案的开发者 Ilija Tovilo 认为,第 1 和第 2 种方式各有利弊。第 3 和第 4 种写法则很容易混淆,并且 4 具有完全不同的语义(variable variables),极少使用这种方式在字符串中插入变量。 因此,Ilija Tovilo 提交的 RFC 正是建议在 PHP 8.2 中弃用上述 3 和 4 的语法,并在 PHP 9.0 中将其删除。
var_dump("${foo}");
// Deprecated: Using ${} in strings is deprecated
 
var_dump("${(foo)}");
// Deprecated: Using ${} (variable variables) in strings is deprecated
对于此提案的影响,Ilija Tovilo 通过对 Packagegist 上的 Top 1000 仓库进行分析得出:上述 3 的语法有 267 次被使用,4 只有 0 次。分析源码:https://gist.github.com/iluuu1994/05427dd74100af8e41ebff3d4201742c Ilija Tovilo 认为,许多其他编程语言也使用${foo}语法在字符串中插入变量,例如 bash 和 JavaScript(在模板字面量 Template Literals 中)。但它们的行为与在 PHP 中的不同。在 PHP 中,这种语法意味着定义可变的变量。在 JavaScript 中,它支持任意表达式。在 PHP 目前的形式中,上述选项 3 和 4 的用途有限,并且对于使用其他相似语法的编程语言的开发者来说,两者行为完全不同,因此会感到困惑。 未来 Ilija Tovilo 希望支持如下语法:
var_dump("{$:func()}")
他认为,如果决定这样做,那么有必要先删除不太有用的选项,以避免进一步增加混乱。这就是 Ilija Tovilo 提交此 RFC 希望实现的目标。

相關推薦

2022-12-07

可以使用 #[SensitiveParameter] 属性标记敏感参数 弃用 ${ 字符串插值 改进的快速文档 按下F1 / Ctrl+Q任何函数、类或方法,PhpStorm 将直接在编辑器中显示文档。 日期时间格式预览 将鼠标悬停在日期格式字符串上时,Php

2022-06-29

注释以 # 开头。以前的双引号语法来自古老的 Vi,会干扰字符串的使用。在许多其他语言中,例如 Python 和 shell 脚本,都知道 # 的含义。 未来的工作 在 Vim9 Script 的计划之一是添加类,虽然可以用字典来模拟,但这还远远不够

2023-10-27

nterprise Audit”的过程。认证 * “mysql_native_password”插件已弃用,用户可以在服务器启动时将其禁用。如果服务器端“mysql_native_password”认证方法被禁用,使用该方法的旧的客户端插件将无法连接服务器,并在错误日志中写入“Acc

2022-10-19

更新内置 Web 服务器的 MIME 类型表 减少各种函数返回的字符串的内存占用 新的 Random 扩展 为 Linux 启用 arc4random_buf 与 Glibc 2.36+ 随机字节 初步支持 ARM64 的 Windows 上的交叉构建 将 JIT 缓冲区 Opcache 分配到靠近 PHP .tex

2022-12-19

能,以实现更复杂的使用。在 Unit 1.29.0 中,JavaScript 模板字符串可以在配置字符串中使用,以执行 JavaScript 表达式。 配置工具 这个版本引入了两个新的命令行工具来简化 Unit 的安装和配置。 setup-unit setup-unit 工具可以在

2022-11-23

msbuild 失败的问题。( #31527 / #31133 ) PHP 修复 php 8.2 弃用问题。( #30997 ) Python 修复轮询尝试之间缺少冷却时间的问题。( #31550 ) 在 Mac OS arm64 上使用系统 OpenSSL 构建。( #31096 ) 删除枚举和未来。( #31381 ) 移除对 Six 的依

2023-03-21

够命名,改变顺序,并从菜单中执行 在文本菜单中增加插入代码片段子菜单 在代码片段功能中增加一个新的范围 "语法样式",以便只在特定的语法样式中执行代码片段功能 为代码片段功能添加一个新的变量 "选择",以将当

2024-03-03

错误导致前端无法正常使用 修复 SqlServer 时间戳转换为字符串 修复带有 UDF的任务发布时 NPE问题 修复 Jar 任务无法获取执行历史问题 修复 Doris 数据源获取 DDL 以及查询时 NPE 导致前端崩溃问题 优化 添加作业配置项的

2023-07-20

,mysqlpump将进行降级处理,使用时将有警告提示,未来将弃用该产品。 用于复制的服务器变量“sync_relay_log_info”、“binlog_format”,在此版本中降级处理,未来将弃用该变量。因此,与其关联的“log_bin_trust_function_creators”和“l

2024-04-13

的验证)。 修复了 bug GH-13203(在 Windows 上处理超过 4GB 字符串的 file_put_contents 失败的问题)。 XML: 修复了 bug GH-13517(使用 --with-expat 构建时出现多个测试失败的问题)。 PHP 8.2.18更多详情可查看:ChangeLog

2023-03-25

许在会话期间切换活动 在 DevicesDetection 中修复 PHP 8.1 的弃用 确保使用 int 值来确定图表中的最大值 修复最小 PHP 版本检查与旧版本的兼容性 Matomo 不能正确地自动检测语言 …… 更多详情可查看:https://matomo.org/changelog/m

2022-12-13

jar 避免使用无效的 JavaPlatform 修复 JavadocImports 的非法字符串修饰问题 …… Groovy NetBeans 不应该在 Groovy 三引号字符串中自动插入 \n\ PHP 修复常量数组访问的语法错误 修复文本运算符(AND、OR、XOR)的格式问题

2022-07-28

出的异常而发生变异。 TableLocator 现在可以更好地处理通过命名空间类名获取表。 不推荐使用 DatabaseQuery 中未使用的属性。 更新公告:https://github.com/cakephp/cakephp/releases/tag/4.4.3  

2023-06-08

区的批评和建议,但为了避免对青语言的误解,我们希望通过本文,对青语言的语法设计进行一些说明。 1、青语言可读性差? 关于这一点,我们认为可能更多的是因为编程习惯的原因,而非青语言设计的问题。 首先,青语