PhpStorm特征自动完成

时间:2013-07-01 11:11:45

标签: php phpstorm traits

我有一个必须始终混入\PHPUnit_Framework_TestCase的子类的特征。 PhpStorm不知道这一点。我能做些什么来让PhpStorm自动完成并在特质中“挑选”像assertNull这样的东西吗?

<?php
trait MyTestUtils
{
    public function foo()
    {
        $this->assertNu // autocomplete?
    }
}

到目前为止,我能想出的最好的方法是在每种方法中加入以下内容:

/** @var \PHPUnit_Framework_TestCase|MyTestUtils $this */

但这是重复的,并不理解受保护的成员。有更好的选择吗?

3 个答案:

答案 0 :(得分:8)

除了使用php docblock来记录$this之外,我所知道的唯一另一种方式,也就是说,无论如何都可以使你的特质更“安全”,就是在特质本身上定义抽象方法,例如: :

 trait F {

    /**
     * @return string[]
     */
    abstract public function Foo();

    /**
     * @return self
     */
    abstract public function Bar();
}

abstract class Bar {
    use F;

    /**
     * @return bool|string[]
     */
    public function Baz () {
        if ($this->Bar()) {
            return $this->Foo();
        }

        return false;
    }
}

答案 1 :(得分:7)

更新:由于PhpStorm 2016.1.2(构建145.1616)特征中的自动完成功能是开箱即用的。它足够聪明,可以找出使用该特征的类,然后提供自动完成功能。链接到该问题:https://youtrack.jetbrains.com/issue/WI-16368

之前回复:

您可以使用:

@method \PHPUnit_Framework_TestCase assertTrue($condition, $message = '')

...在特质本身的docblock中,但缺点是你需要为你想要自动完成的每个方法设置@method,如果你这样做,那就不是太糟糕了在你的特质中使用合理数量的方法调用。或者,“仅记录”您最常使用的那些方法。

答案 2 :(得分:5)

我认为这不是PHP特性的有效用例。您编写的特性不保证仅用于扩展\ PHPUnit_Framework_TestCase的类。这引入了非常紧密耦合的代码。 Traits的最佳实践是让他们松散耦合,只知道自己的内容。

我会建议您:

  1. 创建\ PHPUnit_Framework_TestCase的子类,使您需要此功能的测试用例可以扩展
  2. 创建自定义断言类。这些可以多次用于执行自定义断言组。
  3. 这两种技术详述如下:http://phpunit.de/manual/4.1/en/extending-phpunit.html

    这些是推荐使用辅助方法的两种推荐最佳实践。