14

我是强类型语言的支持者,但我正在开发一个大型 PHP 项目。

我一直在使用 PhpStorm,我喜欢你可以提供的额外类型提示,评论如下:

/** @var \Payments $payment */

/** @property \Payments $payment */

PhpStorm 很棒,因为当类型不匹配时它会给你一些警告。

我想知道是否可以在 PhpStorm 之外静态地进行这种检查。 某种命令行预编译器会遍历代码,还会检查那些额外的提示,以在检测到不匹配时显示一些错误。

这是可以用phpcs完成的吗?

我的最终目标是拥有一个能够提醒我类型不匹配的自动化工具。

我什至考虑切换到 HHVM 以获得更好的类型提示。但我不相信 HHVM 还可以在生产环境中运行。

理想情况下,在 HHVM 上开发额外的类型提示会很棒,但代码不会在我想继续生产的 Zend PHP 引擎上运行。

任何想法?

谢谢。

4

2 回答 2

10

对于静态代码分析,特别是帮助类型错误检测,可以使用类似的工具

PHPCS aka PHP_CodeSniffer是编码标准检查器,对类型错误检测没有真正帮助。

于 2014-02-06T03:07:02.450 回答
5

自动检查类型不匹配

幻影

如果你想检查你的代码类型不匹配,你可以使用Phantm。您可以将其与Jenkins一起使用或与svn hook post-commit一起使用。

来自官方网站

Phantm 是一个用 Scala 编写的工具,可用于检测 PHP 应用程序中潜在的编程错误。它既适用于小型独立脚本,也适用于成熟的应用程序。phantm 代表“类型错误的 PHp 分析器”。

幻影需求

ant
sbt
Java 1.6 or higher
Scala 2.9.1 or higher

用法

$ ./phantm <target.php>

PHPLint

另一种检查 php 代码类型不匹配的方法是PHPLint。您可以将它与 Jenkins、svn 或其他工具一起使用。

来自官方网站

PHPLint 是 PHP 4 和 PHP 5 程序的验证器和文档器。PHPLint 通过透明的元代码扩展了 PHP 语言,可以驱动解析器对源代码进行更严格的检查。PHPLint 不仅仅是一个检查器:它实现了一种在 PHP 语言上实现的新的、强​​类型的语言。您可以考虑使用 PHPLint 从头开始​​构建程序,也可以检查和修复现有程序,或者您可以遵循快速而简单的 PHP 编程方式,然后在程序完成后添加 PHPLint 元代码。无论您选择何种策略,PHPLint 都可以让您的程序更安全、更可靠、有据可查并且错误大大减少。PHPlint 有很好的在线测试工具

有关通过 PHPLint 处理类型的更多信息

用法

  $ phplint <target.php>

手动检查类型不匹配

如果你想使用 PHPStorm 检查你的变量类型,你可以使用 PHPDoc metadata。但是更好地使用php:您可以启用 E_NOTICE 以报告未初始化的变量以捕获变量名称拼写错误。之后,您可以在您的函数中使用实例检查:

/**
 * @param array $data - highlight for PHPStorm
 * @param MySuperClass $row - highlight for PHPStorm
 */
function(array $data, MySuperClass $row)
{
    // Error if $data is not an array
    // Error if $row is not instance of MySuperClass
    /* do something .... */
}

/**
 * @param array $data - highlight for PHPStorm
 * @param MySuperClass $row - highlight for PHPStorm
 */
function($data, $row)
{
    if (!is_array($data))
    {
        throw new TypeException('$data is must be array');
    }

    if (!($row instanceof MySuperClass))
    {
        throw new TypeException('$data is must be array');
    }
}

当开发人员使用TDD方法编写正确的代码时,我认为这是类型检查的最佳方式。非常好的解决方案,您可以在官方 php 文档PHPUnit 官方中阅读。

于 2014-01-30T09:24:50.287 回答