2

我正在对我使用的 PHP 软件进行修改,并且我希望允许用户输入自定义错误报告级别,例如E_ALL & ~E_NOTICE.

问题是它们指定的值被保存为字符串 - 因此我无法在error_reporting()函数中引用它。

无论如何我可以将字符串转换为函数所需的值error_reporting()吗?我已经尝试过这个constant()函数,但是它说找不到常量。

利亚姆

4

3 回答 3

3

AFAIK,constant这里不适合你的主要原因是字符串'E_ALL & ~E_NOTICE'不是常量,而是两个常量和一些位运算符。所以你可以在这里做的是使用这个eval功能。不过……要小心,要非常小心。

另一种方法是获取字符串中使用的所有常量。您可以为此使用正则表达式:

$string = 'E_ALL & ~E_NOTICE';
$intval = 0;
preg_match_all('/[A-Z_]+/',$string, $constants);
//$constants looks like: array(array('E_ALL', 'E_NOTICE'))
foreach ($constants[0] as $key => $const)
{
    //either converts them to their value
    $constants[0][$key] = constant($const);
    //or replace them in the initial string
    //you can do this using preg_replace_callback, too of course
    $string = replace($const, constant($const), $string);
}

如果您选择用它们的值替换常量名称,您至少可以确保将一个稍微安全的字符串传递给eval

$string = preg_replace('/[^0-9&!|\^]/','',$string);//remove anything that isn't a number or bitwise operator.
error_reporting(eval($string));

但是,如果您根本不想使用 eval ,您可能最终会switch在某个函数中编写 a 。这不是我想为你做的事情,如果你想试一试的话:

//Get the constants
preg_match_all('/[A-Z_]/',$string,$constants);
//Get the bitwise operators
preg_match_all('[&|~^\s]', $string, $bitOps);

//eg:
$string= 'E_ALL& ~E_NOTICE ^FOOBAR';
//~~>
$constants = array( array ('E_ALL', 'E_NOTICE', 'FOOBAR'));
$bitops = array( array( ' & ~', ' ^'));//pay close attention to the spaces!

结论/我的意见:
为什么要经历这一切?它很慢,很贵,而且不安全。恕我直言,一个更安全、更简单和更容易的解决方案是存储 int 值,而不是 string
您希望您的客户选择error_reporting级别(我不明白为什么......),为什么不创建一个select并给他们一些预定义的选项。

如果你想让他们完全控制,允许他们使用他们自己的 ini 文件,但坦率地说:你的目标应该是编写你的代码,使其在E_STRICT | E_ALL. 如果你这样做了,就没有太多改变的动力error_reporting......
如果你允许你的客户运行他们自己的代码,并且它会引发警告或错误,请向他们指出他们不应该压制,而是修复它们!

于 2013-03-17T22:19:52.660 回答
0

我不知道拆分部分,但我认为您可以执行以下操作:

$level = NULL;

// Modifications
$level = E_ALL;
$level &= ~E_NOTICE;

error_reporting($level);

通过放置条件,您可以将首选常量添加到变量中。

于 2013-03-17T22:07:00.260 回答
-1

你可以简单地通过数组来做到这一点:

        $string = "E_ALL";
        $errorLevel = array("E_ALL" => E_ALL,
                            "E_NOTICE" => E_NOTICE,
                            "E_ERROR" => E_ERROR,
                            "E_WARNING" => E_WARNING,
                            "E_PARSE" => E_PARSE);
        error_reporting($errorLevel[$string]);
于 2013-03-17T21:42:52.437 回答