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_NOTICEs 并将其他所有内容传递给默认 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中的严格模式的主要内容,如果未能解决你的问题,请参考以下文章

PHPUnit 严格模式有啥作用?

js中的严格模式和非严格模式的比较

使用启用严格模式的Facebook PHP SDK登录时出错

PHP 函数 mb_detect_encoding 严格模式

PHP 严格模式

严格模式更改的规则是啥?