Python的约定是变量是通过第一次赋值创建的,并且在分配一个变量之前尝试读取它们的值会引发异常。相比之下,PHP在读取时会隐式创建一个变量,并带有空值。这意味着在PHP中很容易做到这一点:
function mymodule_important_calculation() {
$result = /* ... long and complex calculation ... */;
return $resukt;
}
此函数始终返回null,如果null是functuion的有效值,则bug可能会在一段时间内未被检测到。 Python等价物会抱怨变量resukt
在被分配之前被使用。
那么......有没有办法通过变量赋值来配置PHP更严格?
答案 0 :(得分:10)
PHP 在解析时没有做太多的事情检查。
你能做的最好的事情就是提高你的警告水平来报告你的错误,但是当你得到一个E_NOTICE时,它太晚了,而且不可能提前强制E_NOTICES发生。
许多人正在携带“error_reporting E_STRICT”标志,但它仍然是追溯性警告,并且不会保护您免受您发布的错误代码错误。
这个宝石出现在本周的php-dev邮件列表中,我认为它只是你想要的工具。它更像是一个lint-checker,但它增加了当前lint检查PHP的范围。
PHP-Initialized Google Project
希望通过一些关注,我们可以在PHP本身中实现这种行为。所以把你的2美分放在PHP邮件列表/ bug系统/功能请求上,看看我们是否可以鼓励它的集成。
答案 1 :(得分:4)
据我所知,没有办法让它失败,但是在error_reporting设置中使用E_NOTICE可以让它发出警告(好吧,通知:-)但是仍然是一个你可以搜索的字符串。)
答案 2 :(得分:1)
查看错误报告http://php.net/manual/en/function.error-reporting.php
你想要的可能是E_STRICT。请记住,PHP没有名称空间,错误报告变得全局化。如果您使用未启用错误报告的开发人员使用第三方库,那将会很糟糕。
答案 3 :(得分:0)
我很确定如果先前未声明变量,它会生成错误。如果您的安装没有显示此类错误,请检查php.ini文件中的error_reporting()级别。
答案 4 :(得分:0)
您可以尝试使用此处指示的错误报告级别:http://us3.php.net/error_reporting但我不确定它是否提及非启动变量的使用,即使使用E_STRICT也是如此。
答案 5 :(得分:0)
有类似的东西:在PHP中,您可以更改错误报告级别。在开发环境中将其设置为最大值是最佳实践。为此:
添加PHP.ini:
error_reporting = E_ALL
或者您可以将其添加到您正在处理的文件的顶部:
error_reporting(E_ALL);
这不会阻止您的代码运行,但缺少变量分配会在浏览器中显示非常明确的错误消息。
答案 6 :(得分:0)
如果您对文件或Zend Studio中的项目使用“分析代码”,它会警告您任何未初始化的变量(这实际上有助于找到大量拼写错误的变量,这些变量潜伏在很少使用的部分代码中等待引起很难发现错误)。也许有人可以在PHP lint函数(php -l)中添加该功能,该功能目前仅检查语法错误。