PhpStorm 在特征中自动完成

2022-08-30 22:15:37

我有一个特征,必须始终将其混入到 的子类中。PhpStorm不知道这一点。我能做些什么来让PhpStorm自动完成和“类型检查”诸如特质内部之类的东西?\PHPUnit_Framework_TestCaseassertNull

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

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

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

但这是重复的,不理解受保护的memebers。有没有更好的选择?


答案 1

除了使用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;
    }
}

答案 2

更新:自 PhpStorm 2016.1.2 (build) 以来,traits 中的自动完成功能开箱即用。它足够聪明,可以弄清楚哪些类使用该特征,然后提供自动完成。链接到该问题:https://youtrack.jetbrains.com/issue/WI-16368145.1616

之前回复过:

您可以使用:

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

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


推荐