此代码给出标题警告。 最简单的解决方案是在“ not_a_constant”中添加单引号。 然而,这打破了“评估” 我尝试串接字符串等。
不应删除评估。 不应使用任何辅助变量。
eval('$some_defined_var[not_a_constant] .= "' . some_function('some_string') . '";')
请尝试使用此代码使用php 7.2定义一些哑变量和函数,以检查警告和可能的解决方案。
修改 1)代码标准禁止对string.s使用双引号 2)我们试图避免在“ not_a_constant”的索引内转义单引号。 这意味着,我要实现的目标是:
$ some_defined_var ['not_a_constant']
答案 0 :(得分:2)
如果您不能转义单引号并且被禁止使用双引号,那么您将剩下heredoc和nowdoc。 manual向您展示如何使用它们。对于您的代码,您可以使用:
<?php
$some_defined_var['not_a_constant'] = 'old ';
function some_function($a) { return 'New '.$a;}
eval( <<<'EOE'
$some_defined_var['not_a_constant'] .= "
EOE
. some_function('some_string') . '";'
);
var_dump($some_defined_var);
请注意,我通常不建议编写此类代码。我只是在施加您的限制。我完全同意所有不喜欢您的编码标准的评论员。
答案 1 :(得分:0)
基于此评论:
在索引内,是的,试图避免转义。在连接的外部,我可以使用双引号,转义,而不是在索引内部。
我认为其中之一可能符合您的奥秘规则:
eval('$some_defined_var[' . "'not_a_constant'" . '] .= "' . some_function('some_string') . '";')
eval("\$some_defined_var['not_a_constant'] .= \"" . some_function('some_string') . '";')
由于您给出的示例可能被重写为:
,感觉到这里为什么真正使用eval
缺少一些上下文。
$some_defined_var['not_a_constant'] = (string)some_function('some_string');
或者可能是:
$some_defined_var['not_a_constant'] = eval('"'. some_function('some_string') . '"');
因为some_function
可以返回执行eval
所需的代码,例如
function some_function($who_cares) {
return '"; var_dump($config["database_password"]); "';
}
如果我们知道哪些部分是动态的,则有关双引号等的规则可能很有意义,因为这可能是为了保护eval
;但坦率地说,保护eval
的唯一方法是不使用它。