Автозаполнение PhpStorm в свойствах
У меня есть черта, которая всегда должна быть смешана с подклассом \PHPUnit_Framework_TestCase
. PhpStorm этого не знает. Есть ли что-нибудь, что я могу сделать, чтобы заставить PhpStorm автозаполнять и "typecheck" вещи, как assertNull
внутри черты?
<?php
trait MyTestUtils
{
public function foo()
{
$this->assertNu // autocomplete?
}
}
Лучшее, что я мог придумать до сих пор, заключается в следующем:
/** @var \PHPUnit_Framework_TestCase|MyTestUtils $this */
Но это повторяется и не понимает защищенных членов. Есть ли лучший вариант?
Ответы
Ответ 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 145.1616
) работает в готовом виде. Он достаточно умен, чтобы выяснить, какие классы используют этот признак, а затем предоставить автозаполнение. Ссылка на вопрос: https://youtrack.jetbrains.com/issue/WI-16368
Ранее отвечал:
Вы можете использовать:
@method \PHPUnit_Framework_TestCase assertTrue($condition, $message = '')
... в docblock самого признака, но недостатком является то, что вам нужно поместить @method
для каждого метода, для которого вы хотите иметь автозаполнение, что не так уж плохо, если вы используете разумное количество вызовов методов в вашей характеристике. Или, "документируйте" только те методы, которые вы используете чаще всего.
Ответ 3
Я бы сказал, что это не допустимый прецедент для PHP-признака. Ваша черта, как написано, не гарантируется только для использования в классах, которые расширяют \PHPUnit_Framework_TestCase. Это вводит очень тесно связанный код. Лучшая практика Трейтов заключается в том, чтобы они были очень слабо связаны и только знали о своем собственном содержании.
Вместо этого я бы рекомендовал вам:
- создать подкласс из \PHPUnit_Framework_TestCase, чтобы ваши тестовые примеры, которые нуждаются в этой функции, могут расширяться
- создавать пользовательские классы утверждений. Они могут многократно использоваться для выполнения групп пользовательских утверждений.
Оба метода подробно описаны здесь: http://phpunit.de/manual/4.1/en/extending-phpunit.html
Это две рекомендуемые рекомендации по размещению вспомогательных методов, таких как.