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