性状的PHPSform自动完成

性状的PHPSform自动完成,php,phpstorm,traits,Php,Phpstorm,Traits,我有一个特性,必须始终混合到\PHPUnit\u Framework\u TestCase的子类中。PhpStorm不知道这一点。我能做些什么让phpsform自动完成并在trait中“检查”诸如assertNull之类的东西吗 <?php trait MyTestUtils { public function foo() { $this->assertNu // autocomplete? } } 但这是重复的,不理解受保护的成员。有更好的

我有一个特性,必须始终混合到
\PHPUnit\u Framework\u TestCase
的子类中。PhpStorm不知道这一点。我能做些什么让phpsform自动完成并在trait中“检查”诸如
assertNull
之类的东西吗

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

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

我认为这不是PHP特性的有效用例。您编写的trait不能保证只用于扩展\PHPUnit\u Framework\u TestCase的类。这引入了非常紧密耦合的代码。特性的最佳实践是,它们之间的耦合非常松散,只知道它们自己的内容

相反,我建议您:

  • 创建\PHPUnit\u Framework\u TestCase的子类,需要此功能的测试用例可以扩展该子类
  • 创建自定义断言类。这些可以多次用于执行自定义断言组
  • 这两种技术的详细信息如下:


    以下是两个推荐的放置此类帮助器方法的最佳实践。

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

    更新:自PhpStorm 2016.1.2(build
    145.1616
    )以来,traits中的自动完成功能是现成的。它足够聪明,可以找出哪些类使用这个特性,然后提供自动完成。链接到问题:

    之前回复为:

    您可以使用:

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

    …在trait本身的docblock中,但缺点是您需要为每个想要自动完成的方法放置
    @method
    ,如果您在trait中使用的方法调用数量合理,这也不太糟糕。或者,只记录您最常用的方法。

    不是ATM——(或类似的:)您找到解决方案了吗
    /**@var\PHPUnit\u Framework\u TestCase | MyTestUtils$this*/
    对我不起作用。我认为紧密耦合的特性在这样的场景中是完全合理的。在(大部分)动态语言中,无论如何,我们必须(大部分)依赖文档来指导抽象的用户。由于单一继承,超类很难任意组合。当你想做断言时,自定义断言类是很好的,但这只是一个特例。你的答案非常棒。通过这种方式,您可以声明存在于trait方法中的强依赖关系。这太棒了,现在客户端明确地知道了我在
    @method
    docblock上的trait dependenciesDocumentation
    @method \PHPUnit_Framework_TestCase assertTrue($condition, $message = '')