PHP中的严格模式
Posted
技术标签:
【中文标题】PHP中的严格模式【英文标题】:Strict mode in PHP 【发布时间】:2011-03-12 16:57:55 【问题描述】:具有自动变量声明的其他语言(如 Perl)具有严格模式。
通过激活这个严格模式,变量声明是必需的,一旦你尝试使用一个未声明的变量,Perl 就会抛出一个错误。
php 是否提供类似的功能?
【问题讨论】:
从版本 7 PHP does support strict mode 开始,只需将declare(strict_types=1);
放在每个(和每个)脚本文件的顶部,在命名空间声明之前。
@Code4R7 这是一种不同于问题中所问的严格模式。
是的。恢复为error_reporting(E_STRICT);
。
【参考方案1】:
是的,在脚本开头输入error_reporting(E_STRICT|E_ALL);
。
【讨论】:
只有 PHP 5.4.0 之前的版本,你需要明确的E_STRICT
。请参阅php.net/manual/en/function.error-reporting.php,其中E_STRICT
自 5.4.0 起成为 E_ALL
的一部分。
但是只在运行时,而不是解析时(如果有的话)?
@PeterMortensen 是的,就像 PHP 中的大多数东西一样,它是运行时。 error_reporting()
可以多次调整,因此仅当 error_reporting 级别设置得足够高时才会影响正在执行的内容。 PHP 包含运行时中的所有内容,通用模板逻辑(又名所有 PHP 代码)依赖于引用未设置的变量,然后通过另一个需要“模板”的脚本设置这些变量,从而设置变量(这里有一些简化/临时术语,但你明白了)。【参考方案2】:
是的,您通过错误报告来做到这一点。
http://www.php.net/manual/en/function.error-reporting.php
【讨论】:
只回答了一半。请查看其他答案。【参考方案3】:有点。您可以在error reporting 中激活E_NOTICE
级别。 (常量列表here。)
每个使用未声明变量的实例都会抛出一个E_NOTICE
。
E_STRICT
错误级别也会抛出这些通知,以及有关如何优化代码的其他提示。
error_reporting(E_STRICT);
终止脚本
如果您真的很认真,并且希望您的脚本终止,而不是在遇到未声明的变量时输出通知,您可以构建一个custom error handler。
一个仅处理带有“未定义变量”的 E_NOTICE
s 并将其他所有内容传递给默认 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
?>
【讨论】:
是的,它有点像其他严格类型的语言,但整体上不像。 @sAc 是的,还有其他的东西也会作为通知输出,所以当你打开它时它们也会出现。 (显然,它不像强类型语言那样严格。) 感谢您的代码运行良好!我将die
更改为 throw
以将输出重定向到 Zend Error Trace 视图。
这很好用,但在这些情况下我没有得到堆栈跟踪。关于如何修改它以获得堆栈跟踪的任何建议?
这只会输出具有E_STRICT
优先级的消息(参见PHP 的源代码)。正如@full 提到的并且您只标记#php,PHP 从 7.0 或 7.1(不确定!)开始就有真正的严格模式。详情请看他的回答。【参考方案4】:
PHP is 默认警告未声明的变量;您只需将error reporting 调高即可看到通知。请注意,由于在 PHP 中声明变量没有特殊的语法,您只需通过赋值来声明一个变量,因此它只会在您尝试使用未声明变量的值 时发出警告。与其他语言相反,“对未声明变量的赋值”不存在,因此 PHP 无法在那里警告您。
【讨论】:
【参考方案5】:使用
error_reporting(E_ALL);
在 PHP 代码的开头。
或者在你的 php.ini 文件中设置 error_reporting 设置,为所有 PHP 文件设置它。
【讨论】:
【参考方案6】:您可以查看error_reporting
,同时不要忘记设置display_errors
。
请注意,有多个级别的错误报告。
【讨论】:
【参考方案7】:使用
error_reporting(-1);
显示所有可能的错误,包括E_STRICT
,甚至在未来的 PHP 版本中添加新级别和常量时。
(Reference)
【讨论】:
error_reporting(-1) 和error_reporting(E_STRICT) 一样吗? @Pacerier no, -1 启用所有当前和未来的错误报告。请参阅 PHP 手册页面底部的 提示。 常量 E_STRICT 等等都是位掩码。通过将它们与 OR 组合,您可以设置这些位。 -1 将设置每一位。示例:A = 1; b(00000001) B = 2; b(00000010) A 或 B = 3 (00000011); -1 = b(11111111) 是two's complement的-1(多少位)还是因为它是负数? 为什么不使用E_ALL
?它似乎是十进制 32767(0x7FFF,15 个 - 二进制 111111111111111)。【参考方案8】:
您可以使用set_error_handler()
实现自己的错误处理功能。
然后您可以根据需要对某些错误级别做出反应。
例如,如果变量未正确声明或满足任何您不喜欢的条件,您可以终止脚本,而不仅仅是显示和记录错误消息。
这样您就可以对在您的 PHP 解释器实例上运行的任何代码实施非常严格的政策。
【讨论】:
【参考方案9】:我建议报告和处理错误的要求在您的开发环境和实时生产环境(WWW、公司内部网等)中有所不同。在开发过程中,您会希望看到尽可能多的细节以发现和解决问题。
在实时环境中,我认为您不想向用户显示 PHP 错误消息,而是允许脚本继续减少功能(例如,类似“抱歉,我们无法在时刻”,或将用户重定向到主页等)。实现此目的的一种方法是为每个环境使用自定义错误处理程序。
【讨论】:
我在测试/开发阶段实现了 Pekkas 代码。 对,还有the risk of exposing the first 16 characters of the database password。【参考方案10】:几年后,PHP 7.0.0 有了
获得declare(strict_types=1)
。
【讨论】:
虽然它被命名为“严格模式”,但它不是严格模式,例如Perl 是。这会进行严格的类型检查,也就是说,如果您的函数需要一个字符串并被赋予一个 int,则不会发生静默转换,但会引发错误。 OP询问的严格模式基本上是您需要说$var = 1
才能使用$var
,因此您不会立即捕获var名称中的拼写错误,而不仅仅是在某些if条件使带有拼写错误的代码运行时.
新链接是php.net/manual/en/…
我所有的项目都可以在php.ini中完成吗?【参考方案11】:
是的,您可以从 PHP 7.X 开始,
declare(strict_types=1);
这将强制所有标量类型声明对类型严格。
但如果您全局启用此功能,它可能会影响其他依赖弱模式的第三方模块(例如,PHP Composer 库),因此请确保在相关类/文件中强制执行。
【讨论】:
什么时候对类型严格?在解析/编译时?还是仅在运行时?【参考方案12】:用途:
error_reporting(E_STRICT);
我认为您需要在上面尝试一下。
【讨论】:
这与之前的答案有何不同? 抱歉哥们我赶时间没看到你的回答以上是关于PHP中的严格模式的主要内容,如果未能解决你的问题,请参考以下文章
使用启用严格模式的Facebook PHP SDK登录时出错