使用带字符串的error_reporting?

时间:2013-03-17 21:30:07

标签: php

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

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

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

利安

3 个答案:

答案 0 :(得分:2)

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。这不是我想为你做的事,如果你想试一试,那就是:

//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!

结论/我的意见:
为什么要经历这一切?它很慢,价格昂贵且不安全。一个更安全,更简单,更简单的解决方案IMHO将存储int值,而不是字符串。 您希望您的客户选择error_reporting级别(我看不出原因......),为什么不创建select并为他们提供一些预定义的选项。

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

答案 1 :(得分:0)

我不知道分裂部分,但我认为你可以做这样的事情:

$level = NULL;

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

error_reporting($level);

使用put条件,您可以为变量添加首选常量。

答案 2 :(得分:-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]);