gpt4 book ai didi

php - PHP 中的可变变量允许使用非法变量名吗?

转载 作者:可可西里 更新时间:2023-11-01 01:14:30 25 4
gpt4 key购买 nike

我在 PHP 语言中发现了一个看似可滥用的错误。在创建可变变量时,可以声明一个看似非法的变量,然后只要您一直将其作为可变变量访问即可进行处理。示例:

${'0'} = 1;         //I am an illegal variable called $0
${'0'}++; //I can be accessed and manipulated.
var_dump(${'0'}); //Output: int(2)

这种行为看起来很奇怪。 SimpleXml的官方文档中简要提到了它作为创建包含连字符的变量名的一种方法,但我的示例表明它仍然可以被严重滥用。

我想知道为什么在解析代码时这种行为是可能的并且是可以容忍的?

最佳答案

内部 PHP stores variables (zend_array* symbol_table) 在用于 arrays 的同一数据结构中.这允许您拥有与数组键具有相同约束的变量名。

例如。 Zend API 函数 zend_set_local_var使用 zend_hash_update 为符号表设置一个值,该函数也用于操作 PHP 数组类型。

然而,我们不能在 PHP 源代码中允许变量名中的每个字符。那是因为词法分析必须将标签与其他标记区分开来。可变变量为此提供了一种解决方法。

这不是错误,也不是滥用任何东西的方法。也就是说,documentation声明所有标签(包括变量)都必须具有正则表达式形式 [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*,所以我不会依赖于变量名中的任意字符。

${'0'} = 1; 实际上做了什么,它将值 1 设置为当前作用域的符号表中键 0。您可以使用 get_defined_vars 获取该特定表功能。看着 source code ,我们将看到该函数只是复制当前符号表并将其返回给调用者。

PHP extract函数 ( src ) 实际上检查键是否具有有效的标签格式(通过调用 php_valid_var_name ),因此您不能使用它生成具有时髦名称的变量。

无论如何,即使可以使用变量语法创建任何名称的变量(甚至是没有名称 ${''} 的变量),我认为这是不好的做法。更糟糕的是,如果图书馆期望或强制您这样做。说这是一种变通方法实际上可能有点言过其实。也许它应该被视为一个实现细节和一个未记录的功能。

关于php - PHP 中的可变变量允许使用非法变量名吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43090642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com