2010-05-11 67 views
5

这是从PHP手册:http://us.php.net/manual/en/language.constants.syntax.phpPHP中是否有配置选项来防止未定义的常量被解释为字符串?

如果你使用一个未定义的常量,PHP假定想要的是该常量本身的名字,就好像你称它作为一个字符串(常量与“恒” )。发生E_NOTICE级别的错误将发生。

我真的不喜欢这种行为。如果我没有定义一个需要的常量,我宁愿脚本失败,以致于我被迫定义它。如果尝试使用未定义的常量,有什么办法强制PHP崩溃脚本?

例如。这两个脚本都做同样的事情。

<?php 
define('DEBUG',1); 
if (DEBUG) echo('Yo!'); 
?> 

<?php 
if(DEBUG) echo('Yo!'); 
?> 

我宁愿第二个脚本DIE并宣布,它试图用一个未定义的常量DEBUG。

回答

3

你可以做一些事情(丑陋的)是这样的:

伪代码:

/** 
* A Notice becomes an Error :) 
*/ 
function myErrorHandler($errno, $errstr, $errfile, $errline) { 
    if ($errno == E_NOTICE) { // = 8 
     if (substr($errstr ...)) { // contains something which looks like a constant notice... 
      trigger_error('A constant was not defined!', E_USER_ERROR); 
     } 
    } 
} 
set_error_handler("myErrorHandler"); 
+0

使用未定义常量的错误代码似乎是8. – Tgr 2010-05-11 17:15:35

+0

谢谢Tgr!我将PHP常量改为E_USER_NOTICE。 – powtac 2010-05-11 17:19:10

+0

+1 - 比我的答案要好。在调试时只设置这个错误句柄可能是一个好主意,因为它取决于可能很慢的子字符串检查(并且可能会导致一些误报)。 – Geoff 2010-05-11 17:25:31

1
if(!defined('DEBUG')) die('failed.'); 
+0

我认为他想警告引发一个E_ERROR ... – 2010-05-11 16:59:05

+0

我知道我能做到这一点,但我希望的更优雅的解决方案。 @Byron是的,我想为PHP申报和E_ERROR而不是E_NOTICE – mrbinky3000 2010-05-11 17:14:01

1

我不认为有一种方法来改变错误抛出的类型,但你可以改变使用error_reporting的错误E_ALL报告,以便您看到这些错误,同时发展:

error_reporting(E_ALL); 
+0

但是,有了这个通知仍然是一个通知! – powtac 2010-05-11 17:11:50

相关问题