PHP eval()::使用未定义的常量not_a_constant-假定为'not_a_constant'PHP 7.2

时间:2018-07-23 16:26:21

标签: php undefined eval php-7.2

此代码给出标题警告。 最简单的解决方案是在“ 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']

2 个答案:

答案 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的唯一方法是不使用它。