【问题标题】:PHP eval():: Use of undefined constant not_a_constant- assumed 'not_a_constant' php 7.2PHP eval():: 使用未定义的常量 not_a_constant- 假定为 'not_a_constant' php 7.2
【发布时间】:2018-07-23 16:26:20
【问题描述】:

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

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

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']

【问题讨论】:

  • 尝试在数组键周围添加双引号:$some_defined_var["not_a_constant"]
  • 对不起,我添加了一些编辑。代码标准禁止:1)字符串的双引号。 2)在这种情况下,尽量不要使用 \' (单引号)。这意味着,我需要实现这一点: some_defined_var['not_a_constant'] (单引号) :-)
  • 您想在字符串中添加单引号,但不允许使用双引号或转义单引号?在这里,你有点把自己逼到角落里了。
  • 任何“禁止”某事的编码标准,即使以降低代码可读性为代价,都是一个糟糕的编码标准。我还认为,将您的编码标准应用于您的代码正在生成的代码是对每个人时间的巨大浪费。在它周围使用双引号。
  • 以防万一“eval 正常,禁止双引号字符串”已经不是一个明显荒谬的规则,您在 PHP 7.2 中第一次看到此消息,因为 it was changed from a "notice" to a "warning"。据推测,您的编码标准只关心警告,但这段代码总是错误的,如果有人写define('not_a_constant', 'something_completely_different'),就会严重崩溃。这段代码被破坏了很多程度,有点搞笑。

标签: php undefined eval php-7.2


【解决方案1】:

如果你不能转义单引号并且被禁止使用双引号,你就剩下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);

请注意,我通常不建议编写这样的代码。我只是在应用你的限制。我完全同意所有不喜欢你的编码标准的评论员。

【讨论】:

    【解决方案2】:

    基于此评论:

    在索引内部,是的,试图避免转义。在外部,在连接中,我可以使用双引号,转义,而不是在索引内部。

    我认为其中一项可能符合您相当神秘的规则:

    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'd 时执行任何操作的代码,例如

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-16
      • 1970-01-01
      • 1970-01-01
      • 2016-08-10
      • 1970-01-01
      • 2019-02-19
      • 2019-11-11
      • 2018-05-05
      相关资源
      最近更新 更多