我正在对我使用的 PHP 软件进行修改,并且我希望允许用户输入自定义错误报告级别,例如E_ALL & ~E_NOTICE
.
问题是它们指定的值被保存为字符串 - 因此我无法在error_reporting()
函数中引用它。
无论如何我可以将字符串转换为函数所需的值error_reporting()
吗?我已经尝试过这个constant()
函数,但是它说找不到常量。
利亚姆
我正在对我使用的 PHP 软件进行修改,并且我希望允许用户输入自定义错误报告级别,例如E_ALL & ~E_NOTICE
.
问题是它们指定的值被保存为字符串 - 因此我无法在error_reporting()
函数中引用它。
无论如何我可以将字符串转换为函数所需的值error_reporting()
吗?我已经尝试过这个constant()
函数,但是它说找不到常量。
利亚姆
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
......
如果你允许你的客户运行他们自己的代码,并且它会引发警告或错误,请向他们指出他们不应该压制,而是修复它们!
我不知道拆分部分,但我认为您可以执行以下操作:
$level = NULL;
// Modifications
$level = E_ALL;
$level &= ~E_NOTICE;
error_reporting($level);
通过放置条件,您可以将首选常量添加到变量中。
你可以简单地通过数组来做到这一点:
$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]);