PhpStorm中traits的自动补全功能

18

我有一个特性必须一直被混合到\PHPUnit_Framework_TestCase的子类中。PhpStorm并不知道这个。有没有什么方法可以让PhpStorm自动完成并在Trait中"类型检查"像assertNull这样的东西?

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

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

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

但这种方法很繁琐,而且无法识别受保护的成员。有更好的选择吗?


3
不是ATM -- http://youtrack.jetbrains.com/issue/WI-16368(或类似的:http://youtrack.jetbrains.com/issues/WI?q=trait) - LazyOne
你找到解决方案了吗?/** @var \PHPUnit_Framework_TestCase|MyTestUtils $this */对我不起作用。 - Alex Kyriakidis
3个回答

11

除了使用php docblock 来记录$this之外,我所知道的唯一其他方法,也可以认为是让你的trait更加“安全”的方式,就是在trait本身上定义抽象方法,例如:

 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;
    }
}

4
你的回答很棒。这样你宣告了一个存在于 trait 方法内部的强依赖关系。 - Constantin Galbenu
太棒了,现在客户端明确知道了我的 trait 依赖关系。 - Kamil Latosinski

8
更新: 自PhpStorm 2016.1.2 (build 145.1616)之后,Trait的自动完成功能可以直接使用。它足够聪明地找出使用Trait的类,并提供自动完成。问题链接:https://youtrack.jetbrains.com/issue/WI-16368 之前的回答: 您可以使用:
@method \PHPUnit_Framework_TestCase assertTrue($condition, $message = '')

...在trait本身的docblock中添加方法说明可以实现自动补全,但缺点是您需要为每个想要有自动补全的方法添加@method标签。如果您在trait中使用合理数量的方法调用,则并不太糟糕。或者,只“记录”您最常使用的那些方法。


1
@method docblock 的文档 https://www.phpdoc.org/docs/latest/references/phpdoc/tags/method.html - Will B.

5
我认为这不是使用PHP Trait的有效用例。你编写的Trait不能保证仅用于扩展PHPUnit_Framework_TestCase的类,这会引入非常紧密耦合的代码。Traits的最佳实践是它们非常松散地耦合,并且仅知道自己的内容。
我建议你可以选择以下方法之一:
1. 创建一个\PHPUnit_Framework_TestCase的子类,让需要此功能的测试用例继承该子类。 2. 创建自定义断言类。这些类通常可用于执行自定义断言组。
这两种技术在http://phpunit.de/manual/4.1/en/extending-phpunit.html中有详细介绍。
这些是放置此类帮助方法的两个推荐最佳实践。

3
在这种情况下,我认为紧密耦合的特性是完全合理的。在一个(大多数情况下)动态语言中,我们必须(大多数情况下)依赖文档来指导我们的抽象层的使用者。超类存在单继承的限制,很难任意组合。自定义断言类用于做断言时很好用,但那只是一种特殊情况。 - mpartel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接