性状的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的类。这引入了非常紧密耦合的代码。特性的最佳实践是,它们之间的耦合非常松散,只知道它们自己的内容 相反,我建议您:
以下是两个推荐的放置此类帮助器方法的最佳实践。除了使用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 = '')