2010-07-07 89 views
54

具有自动变量声明的其他语言 - 比如Perl - 具有严格的模式。PHP中的严格模式?

通过激活这种严格模式,变量声明是必需的,只要您尝试使用未声明的变量,Perl就会抛出错误。

PHP提供任何类似的功能吗?

+1

由于版本7 [PHP确实支持严格模式](http://php.net/manual/en/migration70.new-features.php),只是把'声明(strict_types = 1); '在每个(和每个)脚本文件的顶部,在命名空间声明之前。 – Code4R7 2017-05-23 09:05:57

+0

@ Code4R7这是一种不同的严格模式,然后在问题中询问。 – Flimm 2017-07-03 16:59:58

+0

是的。恢复为'error_reporting(E_STRICT);'。 – Code4R7 2017-07-04 09:03:03

回答

60

的种类。您可以激活error reporting中的E_NOTICE级别。 (常量列表here。)

每个使用未声明变量的实例都将引发一个E_NOTICE

E_STRICT错误livel也会抛出这些通知,以及其他关于如何优化代码的提示。

error_reporting(E_STRICT); 

终止脚本

如果你真的很严重,希望你的脚本终止而不是遇到一个未声明的变量时,只是输出的通知,你可以建立一个custom error handler

,在他们只处理与“未定义的变量”的告示,并传递到默认的PHP错误处理一切工作例如:

<?php 

error_reporting(E_STRICT); 

function terminate_missing_variables($errno, $errstr, $errfile, $errline) 
{        
    if (($errno == E_NOTICE) and (strstr($errstr, "Undefined variable"))) 
    die ("$errstr in $errfile line $errline"); 

    return false; // Let the PHP error handler handle all the rest 
} 

$old_error_handler = set_error_handler("terminate_missing_variables"); 

echo $test; // Will throw custom error 

xxxx(); // Will throw standard PHP error 

?> 
+0

是的,它有点像其他严格类型的语言,但没有整体。 – Sarfraz 2010-07-07 08:30:32

+1

@sAc yup,还有其他东西也会作为通知输出,所以当你打开它时它们也会出现。 (显然,它不像强类型语言那样严格。) – 2010-07-07 08:31:42

+0

感谢您的代码工作出色!我将'die'改为'throw'将输出重定向到Zend Error Trace视图。 – jantimon 2010-07-07 13:30:28

3

是的,在脚本的开头键入error_reporting(E_STRICT|E_ALL);

+0

只有在使用PHP 5.4.0之前,您需要明确指定'E_STRICT'。请参阅http://php.net/manual/en/function.error-reporting.php,其中'E_STRICT'自5.4.0起成为'E_ALL'的一部分。 – Roland 2017-10-27 13:01:16

1

PHP 警告大约在默认情况下未声明的变量,你只需要要打开error reporting级别,以便您可以看到通知。请注意,由于没有特别的语法来声明PHP中的变量,并且只需通过分配给它来声明一个变量,它只能在您尝试时使用未声明的变量的值来警告您。与其他语言相反,“未声明的变量赋值”不存在,所以PHP无法在那里提醒你。

1

使用

error_reporting(E_ALL); 

在你的PHP代码的开始。 或在您的php.ini文件中设置error_reporting设置,为所有PHP文件设置它

35

使用

error_reporting(-1); 

显示每一个可能的错误,包括E_STRICT甚至当新的水平和常量在未来的PHP版本中加入。

Reference

+5

+1表示事物和未来的兼容性。 – Sarfraz 2010-07-07 08:37:45

+1

这真是太神奇了,谢谢! – 2013-01-16 03:41:33

+1

error_reporting(-1)与error_reporting(E_STRICT)相同吗? – Pacerier 2013-06-06 14:16:08

1

您可以set_error_handler()实现自己的错误处理功能。

然后,您可以根据需要对某些错误级别做出反应。

例如,如果未正确声明变量或遇到任何不满意的情况,您可以终止脚本,而不是仅显示和记录错误消息。

这样,您可以对在PHP解释器实例上运行的任何代码执行非常严格的策略。

0

我建议报告和处理错误的要求在您的开发环境和现场生产环境(WWW,公司内联网等)中有所不同。在开发过程中,您会希望尽可能详细地查看和修复问题。

在现场环境中,我认为不是想向用户显示PHP错误消息,而是允许脚本继续使用减少的功能(例如,“很抱歉,我们无法更新您的配置文件时刻“,或将用户重定向到主页等)。一个方法来实现这一点将通过使用自定义错误处理程序为每个环境

+0

我在测试/开发阶段实现了Pekkas代码。 – jantimon 2010-07-07 13:27:26