0

我有一个基于 PHP 的小型应用程序,它的大小开始适度增长。

我开始关心管理我的 PHP 代码库,因为PHP是一种松散/弱类型的动态语言

其他人如何管理基于松散/弱类型动态语言的代码?

是否存在用于 PHP 的预解析器,允许我对我的代码库运行检查以识别如下所示的内容?

$var1 = 'data';
// vr1 doesn't exist, it's a typo of $var1, but PHP would allow for this and not complain
echo $vr1;

更新

上面的例子可能不是最好的例子,但本质上,我想传达的是,动态弱类型语言中的某些错误只有在代码在 RUN TIME 在生产环境中运行时才会被发现;然而,其中一些问题通常会在编译时在强类型静态语言中发现。

在将我的代码投入生产之前,如何在 PHP 中找到这些非算法类型的错误,而不必创建大量单元测试?

因此,在投入生产之前,是否存在我可以通过它运行我的 PHP 代码的任何东西,并且这个预处理器会解析我的代码以确保我只使用定义的变量等。基本上,检查我的代码以进行验证非算法类型的用途。例如,不尝试在字符串上执行代数等。

更新 2

请注意,这个问题仍然没有得到回答,因为我正在寻找一种方法来识别 PHP 中这些类型的“编译”类型的非算法错误,而不是运行时间。

4

8 回答 8

10

您可以使用php -l filename.php. 这将显示任何语法错误。那里有 IDE 会在您编写代码时进行 lint。除了 linting 之外,这些通常还可以检测到问题中显示的问题。

除此之外,请考虑为您的代码编写 UnitTests以确保功能,并查看http://phpqatools.org以了解可以帮助您提高代码质量的许多其他工具。

确保您error_reporting(-1);在开发期间已设置启用所有错误,除了启用display_errorsdisplay_startup_errors在 php.ini 中。在您的生产系统上禁用后两者以防止服务器信息泄露。

更新后编辑:动态编译 PHP 源代码。PHP 的编译时间实际上是在运行时。如果你想编译 PHP,你必须使用 Facebook 的 HipHop。

于 2010-07-25T21:37:45.330 回答
4

运行时错误

未初始化的变量是PHP 中的运行时错误(级别E_NOTICE),因此您只能在运行时看到它们。您给出的示例可能会或可能不会最终出错,具体取决于代码的执行方式。例如,它可能是在有时包含有时不包含$vr1的条件中定义的。include()

此外,可以在运行时使用变量变量( $$var) 动态创建变量,因此$vr1实际上也可以在某处定义。如果 PHP 解释器无法运行有效语法,或者在有效语法上给出编译器错误,那将是另一类问题。

您可以将未初始化的变量情况与除以零错误进行比较。这不是错误,除非它真的发生了。

PHP 中的编译时错误为E_PARSEE_COMPILE_ERRORE_COMPILE_WARNING(非致命)。这些包括诸如丢失文件、函数或类之类的事情,即试图执行不存在的代码——这是 PHP 不可能做到的。如果PHP可能可以,它会尝试。

检测与预防

至少,您应该确保您的开发和测试环境在 ini 中打开了所有 PHP 错误垃圾:

error_reporting = E_ALL|E_STRICT
display_errors = On

或在运行时:

error_reporting(-1);

自律

使用 PHP 的一些提示可能会有所帮助:

  • 使用函数式编程
  • 建立代码气味并编写干净的语法
  • 做你自己的类型检查(OOP 和函数式编程可以让这更容易)
  • 避免全局范围和include()基于控制结构
  • 使用带有代码意识辅助工具的 IDE,例如Netbeans

例如,在上面的示例中,如果您必须将变量传递给检查参数的函数或方法,isset()或者!== null在使用它之前,您可以避免或减轻未初始化变量的问题。

资源

于 2010-07-26T01:59:07.287 回答
4

如果您适当地设置了您的 error_reporting 配置指令,PHP 肯定会通过警告或通知来抱怨这一点。

看:

http://us2.php.net/manual/en/errorfunc.configuration.php#ini.error-reporting

于 2010-07-25T21:39:28.430 回答
0

由于 PHP 通常不被认为要经过单独的编译过程,也许你可以解释一下你认为你的代码是在什么时候被编译的?

于 2010-07-26T03:06:16.547 回答
0

这是另一个关注 PHP 代码分析工具的SO 问题。

于 2010-07-27T18:01:31.193 回答
0

如果您将错误报告设置为最大值,则会捕获该类型的错误。它会给出一个通知,表明 $vr1 没有设置。

您可以在 php.ini 文件中或使用 ini_set() 函数在单个页面上设置错误报告。

于 2010-07-25T21:39:44.250 回答
0

最接近的是 php 的 lint 检查器,但它更像是一个语法检查器。您可以从命令行运行 lint:

php -l path/to/file.php

您可以通过设置提交前检查将其构建到您的文件存储库系统中。

于 2010-07-25T22:47:17.890 回答
0
  1. Hack是 Facebook 创建的一种静态类型语言,本质上是 PHP,添加和删除了许多功能。
  2. PhpStorm是一个 IDE,它提供“检查”,可以捕获静态类型检查器可能捕获的许多内容,例如示例中的未定义变量。
  3. 我开始在这里基于 PHP7 类型提示和 PHPDoc 注释为 PHP 编写静态类型检查器。我从来没有完成它,但有一些通过测试,到目前为止的设计似乎是合理的。
于 2016-03-27T12:01:56.457 回答