我有一个必须始终混入\PHPUnit_Framework_TestCase
的子类的特征。 PhpStorm不知道这一点。我能做些什么来让PhpStorm自动完成并在特质中“挑选”像assertNull
这样的东西吗?
<?php
trait MyTestUtils
{
public function foo()
{
$this->assertNu // autocomplete?
}
}
到目前为止,我能想出的最好的方法是在每种方法中加入以下内容:
/** @var \PHPUnit_Framework_TestCase|MyTestUtils $this */
但这是重复的,并不理解受保护的成员。有更好的选择吗?
答案 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的最佳实践是让他们松散耦合,只知道自己的内容。
我会建议您:
这两种技术详述如下:http://phpunit.de/manual/4.1/en/extending-phpunit.html
这些是推荐使用辅助方法的两种推荐最佳实践。