【问题标题】:PHP - static type checking a-la PhpStormPHP - 静态类型检查 a-la PhpStorm
【发布时间】:2014-02-18 23:42:08
【问题描述】:

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

我一直在使用 PhpStorm,我喜欢您可以提供的额外类型提示,例如这些 cmets:

/** @var \Payments $payment */

/** @property \Payments $payment */

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

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

phpcs 可以做到吗?

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

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

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

有什么想法吗?

谢谢。

【问题讨论】:

  • PHPStorm 通常会提醒您如果它知道类型不匹配。因此,如果您有一个函数/** @returns int */ getInt(),并且您说/** @var boolean $boolean */ $boolean = getInt(),则会出现错误,因为PHPStorm getInt() 返回一个整数而不是布尔值。更智能的东西可能需要能够运行 PHP(未预编译),所以像 PHPUnit 或 xDebug 这样的调试套件可能会有所帮助?
  • 您是否考虑过使用像 Jenkins 这样的构建服务器?您可以自动部署到那里的目标服务器,并在允许部署之前检查单元测试以及各种语法和代码样式工具。所有这些都可以在任何 SVN 提交后自动完成。
  • 似乎还没有人理解你的问题。我是否正确,您正在使用 PHPStorm 通过 phpdoc cmets 对类型进行自动检查?您不是在搜索有关如何使用类型创建代码或如何使 PHPStorm 做到这一点的信息?如果是这样,您可能需要澄清您的问题,因为当前的答案有误... ;)
  • @ToBe Jenkins 使用测试工具作为 CodeSniffer 和其他工具。它没有测试工具
  • @Dmitriy.Net 没错。这不是他想要的吗?

标签: php hhvm


【解决方案1】:

自动检查类型不匹配

幻影

如果您想检查您的代码是否存在类型不匹配,您可以使用 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 都可以让您的程序更安全、更可靠、文档更完善,并且 bug 大大减少。 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 阅读。

【讨论】:

  • 哇,这个答案......他正在寻求一种方法来使用 phpcs 或类似的方法来自动化它。你的答案是使用 TDD 编写“正确的代码”。这是我对“php doc”和“php unit”的证明参考,用于在无关紧要的棺材上做最后的钉子。我完全同意你的看法,但我也建议他带着尖刺的俱乐部在开发人员周围走动,并在他们不遵循 Dmitry.Net 编码标准时狠狠地打击他们。因为这比命令行脚本自动化更容易。
  • 是的,但我回答后作者改变了问题
【解决方案2】:

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

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

【讨论】:

  • 这里真正的玩家是Scrutinizer(第一个链接)但不幸的是它不是开源的:(
猜你喜欢
  • 2018-06-30
  • 1970-01-01
  • 2021-02-28
  • 1970-01-01
  • 2010-11-23
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多