Автозаполнение PhpStorm в свойствах - программирование
Подтвердить что ты не робот

Автозаполнение PhpStorm в свойствах

У меня есть черта, которая всегда должна быть смешана с подклассом \PHPUnit_Framework_TestCase. PhpStorm этого не знает. Есть ли что-нибудь, что я могу сделать, чтобы заставить PhpStorm автозаполнять и "typecheck" вещи, как assertNull внутри черты?

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

Лучшее, что я мог придумать до сих пор, заключается в следующем:

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

Но это повторяется и не понимает защищенных членов. Есть ли лучший вариант?

4b9b3361

Ответ 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

Это две рекомендуемые рекомендации по размещению вспомогательных методов, таких как.