PHP eval():使用未定义的常量not_a_常量-假定';非常数';PHP7.2

PHP eval():使用未定义的常量not_a_常量-假定';非常数';PHP7.2,php,undefined,eval,php-7.2,Php,Undefined,Eval,Php 7.2,此代码给出标题的警告。 最简单的解决方案是将单引号添加到“not_a_常量”中。 然而,这打破了“评估” 我尝试过串接等 不应移除eval。 不应使用辅助变量 eval('$some_defined_var[not_a_constant] .= "' . some_function('some_string') . '";') 请尝试使用PHP7.2定义一些哑变量和函数的代码,以检查警告和可能的解决方案 编辑 1) 代码标准禁止对string.s使用双引号 2) 我们试图避免在“非a_常数”的

此代码给出标题的警告。 最简单的解决方案是将单引号添加到“not_a_常量”中。 然而,这打破了“评估” 我尝试过串接等

不应移除eval。 不应使用辅助变量

eval('$some_defined_var[not_a_constant] .= "' . some_function('some_string') . '";')
请尝试使用PHP7.2定义一些哑变量和函数的代码,以检查警告和可能的解决方案

编辑 1) 代码标准禁止对string.s使用双引号 2) 我们试图避免在“非a_常数”的索引中跳过单引号。 这意味着,我试图实现的是:

$some_defined_var[“非常数”]


如果您不能转义单引号,并且禁止使用双引号,则留给您的是herdeoc和nowdoc。这本书向你展示了如何使用它们。对于您的代码,您可以使用:

<?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);
基于此评论:

在索引中,是的,试图避免逃逸。在外部,在串联中,我可以使用双引号,转义,但不在索引内部

我认为其中一个可能符合你的神秘规则:

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') . '"');
由于
某些函数
可以返回在
求值时执行任何操作的代码,例如

function some_function($who_cares) {
    return '"; var_dump($config["database_password"]); "';
}

如果我们知道哪些部分是动态的,关于双引号等的规则可能是有意义的,因为这可能是为了保护
eval
;但是坦率地说,确保
eval
安全的唯一方法是不使用它。

尝试在数组键周围添加双引号:
$some\u defined\u var[“not\u a\u constant”]
对不起,我正在添加一些编辑。代码标准禁止:1)字符串的双引号。2) 在这种情况下,尽量不要使用\'(跳过单引号)。这意味着,我需要实现这一点:一些定义的变量['not'ua'u constant'](单引号):-)您想在字符串中添加单引号,但不允许使用双引号或转义单引号?在这里,你有点把自己逼到了一个角落。任何“禁止”某些东西的编码标准,即使是以降低代码可读性为代价,都是一个糟糕的编码标准。我还认为,将您的编码标准应用于您的代码生成的代码是对每个人时间的巨大浪费。如果“eval fine,double-quoted strings banked”已经不是一条明显荒谬的规则,那么您将在PHP7.2中第一次看到这条消息,因为。大概,您的编码标准只关心警告,但这段代码总是错误的,如果有人编写
define('not\u a\u constant','something\u exterly\u distance')
,代码就会严重崩溃。这个代码被破坏了很多程度,有点可笑。