像Perl这样具有自动变量声明的其他语言都有一个严格模式。
通过启用此严格模式,需要进行变量声明,当您尝试使用未声明的变量时,Perl会立即抛出错误。
PHP是否提供类似的功能?
像Perl这样具有自动变量声明的其他语言都有一个严格模式。
通过启用此严格模式,需要进行变量声明,当您尝试使用未声明的变量时,Perl会立即抛出错误。
PHP是否提供类似的功能?
可以说是这样的。您可以在错误报告中激活E_NOTICE
级别。(常量列表在此处。)
每当使用未声明的变量时,都会抛出一个E_NOTICE
。
E_STRICT
错误级别也会抛出这些通知,以及有关如何优化代码的其他提示。
error_reporting(E_STRICT);
终止脚本
如果您真的很严肃,想要在遇到未声明的变量时使您的脚本终止,而不仅仅是输出通知,则可以构建一个自定义错误处理程序。
下面是一个可工作的示例,它只处理包含“未定义变量”E_NOTICE
并将其他所有内容传递给默认的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
?>
error_reporting(E_STRICT)
只影响文件内的代码,还是会全局设置所有代码的设置? - Flimminclude()
的文件中)。 - PekkaE_STRICT
优先级的消息(请参阅PHP源代码)。正如@full所提到的,您仅标记了#php,自PHP 7.0或7.1以来(不确定!)已经有了真正的严格模式。有关详细信息,请参见他的答案。 - RolandE_ALL
?它似乎是十进制32767(0x7FFF,15个1-二进制111111111111111)。 - Peter MortensenE_ALL
只包括 E_STRICT
。因此,在2010年提出问题时,“all”并不意味着“全部”。 - Gordon经过几年的时间,PHP 7.0.0终于支持declare(strict_types=1)
。
$var
之前必须先声明$var = 1
,因此您可以立即捕获变量名拼写错误,而不仅仅是在某些条件下运行具有拼写错误的代码时才发现。 - janh在您的脚本开头键入error_reporting(E_STRICT|E_ALL)
。
error_reporting()
可以被多次调整,因此只有在设置了足够高的 error_reporting 级别时才会影响正在执行的内容。PHP 在运行时包括所有内容,常见的模板逻辑(即所有 PHP 代码)依赖于引用未设置的变量,然后通过另一个需要“模板”的脚本设置这些变量(这里使用了一些简化/临时术语,但您可以理解这个想法)。 - chelmertzPHP默认会警告未声明的变量;您只需要将错误报告级别提高,这样您就可以看到通知了。请注意,由于在PHP中没有特殊的语法来声明变量,您只需通过赋值来声明变量,因此它只能在您尝试使用值的未声明变量时警告您。与其他语言不同,“分配给未声明变量”的情况不存在,因此PHP无法在那里警告您。
您可以使用 set_error_handler()
实现自己的错误处理函数。
然后,您可以根据需要对特定的错误级别做出反应。
例如,您可以在变量未正确声明或满足任何不喜欢的条件时终止脚本,而不仅仅是显示和记录错误消息。
这样,您就可以强制执行非常严格的策略,以便在 PHP 解释器实例上运行的任何代码都符合要求。
使用
error_reporting(E_ALL);
在你的 PHP 代码开头处添加。
或者在你的 php.ini 文件中设置 error_reporting 设置,以设置所有 PHP 文件的错误报告。
是的,从PHP 7.X版本开始,您可以这样做。
declare(strict_types=1);
这将强制所有标量类型声明严格遵循类型。
但是,如果您在全局范围内启用此功能,则可能会影响其他第三方模块(例如,PHP Composer 库),这些模块依赖于弱模式,请确保在相关的类/文件中强制执行它。
是的,您可以通过错误报告来实现。
declare(strict_types=1);
即可。 - Code4R7error_reporting(E_STRICT);
。 - Code4R7