PHP中的严格模式?

jan*_*mon 61 php variables declaration

其他具有自动变量声明的语言(如Perl)具有严格模式.

通过激活此严格模式,需要变量声明,并且只要您尝试使用未声明的变量,Perl就会抛出错误.

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

Pek*_*ica 65

的种类.您可以E_NOTICE错误报告中激活级别.(这里的常量列表.)

使用未声明变量的每个实例都会抛出一个E_NOTICE.

E_STRICT错误livel也将使你的通知,以及关于如何优化代码的其他提示.

error_reporting(E_STRICT);
Run Code Online (Sandbox Code Playgroud)

终止脚本

如果你真的很认真,并希望你的脚本终止而不是只是在遇到未声明的变量时输出通知,你可以构建一个自定义错误处理程序.

仅处理其中带有"未定义变量"的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

 ?>
Run Code Online (Sandbox Code Playgroud)

  • 这仅输出具有“E_STRICT”优先级的消息(参见 PHP 的源代码)。正如@full 提到的,你只标记了#php,PHP 从 7.0 或 7.1(不确定!)开始是真正的严格模式。详情请看他的回答。 (2认同)

Gor*_*don 40

使用

error_reporting(-1);
Run Code Online (Sandbox Code Playgroud)

显示每个可能的错误,包括E_STRICT甚至在将来的PHP版本中添加新的级别和常量时.

(参考)

  • +1为-1事和未来的兼容性. (7认同)
  • 常量E_STRICT等是位掩码。通过将它们与或组合,可以设置这些位。-1将置位每一位。示例:A = 1;b(00000001)B = 2; b(00000010)A或B = 3(00000011); -1 = b(11111111) (4认同)
  • error_reporting(-1) 和 error_reporting(E_STRICT) 一样吗? (2认同)

Ful*_*ull 5

几年后,PHP 7.0.0获得了 declare(strict_types=1);

http://php.net/manual/zh-CN/functions.arguments.php#functions.arguments.type-declaration.strict

  • 虽然它被命名为“严格模式”,但它并不是 Perl 等中的严格模式。这会进行严格的类型检查,也就是说,如果您的函数需要一个字符串并给定一个 int,则不会发生静默转换,但会抛出错误。OP 询问的严格模式基本上是你需要先说 `$var = 1`,然后才能使用 `$var`,所以你不会立即捕获 var 名称中的拼写错误,而不仅仅是在某些 if 条件生成代码时与拼写错误运行。 (3认同)