PHP 等效于 Perl 的“使用严格”(要求在使用前初始化变量)

Posted

技术标签:

【中文标题】PHP 等效于 Perl 的“使用严格”(要求在使用前初始化变量)【英文标题】:PHP equivalent of Perl's 'use strict' (to require variables to be initialzied before use) 【发布时间】:2010-09-10 15:21:13 【问题描述】:

Python 的约定是变量是通过第一次赋值创建的,并且在赋值之前尝试读取它们的值会引发异常。相比之下,php 在读取时隐式创建一个变量,其值为空。这意味着在 PHP 中很容易做到这一点:

function mymodule_important_calculation() 
    $result = /* ... long and complex calculation ... */;
    return $resukt;

此函数始终返回 null,如果 null 是该函数的有效值,则该错误可能会在一段时间内未被检测到。 Python 等效项会抱怨变量 resukt 在分配之前正在使用。

那么...有没有办法将 PHP 配置为更严格地分配变量?

【问题讨论】:

我问了一个类似的问题:Php error_reporting, Best setting for development? E_STRICT ? 郑重声明,Perl 中的“使用严格”在使用前不需要变量初始化。它强制执行声明 【参考方案1】:

PHP 在解析时不会做太多的前向检查。

您可以做的最好的事情是提高警告级别以报告您的错误,但是当您收到 E_NOTICE 时,为时已晚,而且还不能强制 E_NOTICE 提前发生。

很多人都携带“error_reporting E_STRICT”标志,但它仍然具有追溯性警告,并且不会像您发布的那样保护您免受不良代码错误的影响。

这个 gem 本周出现在 php-dev 邮件列表中,我认为它正是您想要的工具。它更像是一个 lint-checker,但它增加了当前 lint 检查 PHP 所做的范围。

PHP-Initialized Google Project

希望只要稍加注意,我们就可以在 PHP 本身中实现这种行为。所以把你的 2 美分放在 PHP 邮件列表/错误系统/功能请求上,看看我们是否可以鼓励它的集成。

【讨论】:

未必为时已晚,或者您正在向世界扔未经测试的代码?我同意最好让它在解析时失败,但说为时已晚表明你甚至没有测试它:-) 好吧,这取决于您编写测试用例的能力。并且取决于您的测试用例是否有可变的错误输入(这会被忽视)。接下来是什么,测试用例的测试用例? 不,只是说可能为时已晚,而不是为时已晚就足够了。我承认,虽然不是很相关。【参考方案2】:

据我所知,没有办法让它失败,但是在 error_reporting 设置中使用 E_NOTICE 可以让它发出警告(嗯,一个通知 :-) 但仍然是一个你可以搜索的字符串)。

【讨论】:

【参考方案3】:

查看错误报告,http://php.net/manual/en/function.error-reporting.php

你想要的可能是 E_STRICT。请记住,PHP 没有命名空间,并且错误报告是全局的。如果您使用开发人员提供的没有打开错误报告功能的 3rd 方库,那您会觉得很糟糕。

【讨论】:

【参考方案4】:

我很确定如果变量之前没有声明它会产生错误。如果您的安装没有显示此类错误,请检查 php.ini 文件中的 error_reporting() 级别。

【讨论】:

【参考方案5】:

您可以尝试使用此处指示的错误报告级别:http://us3.php.net/error_reporting 但我不确定它是否提到了未启动变量的使用,即使使用 E_STRICT。

【讨论】:

【参考方案6】:

有类似的东西:在 PHP 中,您可以更改错误报告级别。在开发环境中将其设置为最大值是最佳实践。这样做:

在你的 PHP.ini 中添加:

error_reporting = E_ALL

或者您可以将其添加到您正在处理的文件的顶部:

error_reporting(E_ALL);

这不会阻止您的代码运行,但缺少变量分配将在您的浏览器中显示非常清晰的错误消息。

【讨论】:

PHP6之前,需要E_ALL | E_STRICT,否则你不会得到“全部”。 :)【参考方案7】:

如果您对文件或 Zend Studio 中的项目使用“分析代码”,它会警告您任何未初始化的变量(这实际上有助于发现大量拼写错误的变量潜伏在代码的很少使用部分等待导致很难发现错误)。也许有人可以在 PHP lint 函数 (php -l) 中添加该功能,该函数目前仅检查语法错误。

【讨论】:

以上是关于PHP 等效于 Perl 的“使用严格”(要求在使用前初始化变量)的主要内容,如果未能解决你的问题,请参考以下文章

Perl 的等价于 PHP 的 print_r() 是啥?

Qt 等效于 Perl 打包/解包

Python 等效于 Perl 的 HTTP::Async->next_response

是否有 Python 等效于正则表达式的 Perl "/x" 修饰符?

高效 pre-perl-5.10 等效于 pack("Q>")

使用管道在 Perl 中将管道文件输出到 gzip 的 Python 等效项