PHP - 静态类型检查a-la PhpStorm

时间:2014-01-27 22:03:04

标签: php hhvm

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

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

/** @var \Payments $payment */

/** @property \Payments $payment */

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

我想知道是否有可能在PhpStorm之外静态地进行这种检查。 一些类型的命令行预编译器将通过代码,检查那些额外的提示,以便在检测到不匹配时显示一些错误。

这可以用 phpcs 完成吗?

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

我甚至考虑转换到HHVM以获得更好的类型提示。但我不相信HHVM还没有投入生产。

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

有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:10)

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

等工具

PHPCS aka PHP_CodeSniffer是编码标准检查程序,对类型错误检测没有多大帮助。

答案 1 :(得分:4)

自动检查类型不匹配

<强> Phantm

如果您想检查代码是否存在类型不匹配,可以使用 Phantm 。您可以将其与Jenkins一起使用,也可以与svn hook post-commit一起使用。

来自官方网站

Phantm是一个用Scala编写的工具,可用于检测PHP应用程序中潜在的编程错误。它既适用于小型孤立脚本,也适用于完整的应用程序。 phantm代表“PHp ANalyzer for Type Mistakes”。

Phantm 需要

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很不错online test tool

有关 working with types by PHPLint

的详情

<强>用法

  $ phplint <target.php>

手动检查类型不匹配

如果要使用PHPStorm you can use PHPDoc metadata检查变量类型。但更好的方法是使用php for this:您可以为报告未初始化的变量启用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方法撰写正确的代码时,我认为最佳方式。 非常好的解决方案,您可以在official php documentationPHPUnit official阅读。