Подтвердить что ты не робот

Как документировать методы магии (_call и _callStatic) для IDE

После многих счастливых лет кодирования в блокноте ++ и возвышенном, мне посоветовали дать PHP IDE. Я пытаюсь phpStorm, и мне кажется, что это хорошо. Завершение и документация кода - отличная функция, но не работает для меня, когда используются магические методы. Есть ли работа, чтобы заставить phpStorm понять, что происходит в магических методах?

Наша ситуация примерно такая:

abstract class a {
    public static function __callStatic($method,$args)
    {
        if(strpos($method,"get_by_") === 0)
        {
            //do stuff
        } elseif(strpos($method,"get_first_by_") === 0) {
            //do stuff
        } elseif($method == "get_all") {
            //do stuff
        }
    }
}

class b extends a {
    // some more stuff
}

b::get_by_user_id(27);
b::get_first_by_id(156);
b::get_all();

Метод magic callStatic позволяет получить коллекцию объектов через 1 или более аргументов, которые составляют вызов функции.

Я вижу, что в этих случаях есть оператор @method, но phpStorm только подбирает первое из этих утверждений. Кроме того, я могу только установить тип возвращаемого значения в смешанный, где я бы предпочел установить его как любой класс, на который он был вызван (b в моем примере).

Любые идеи или предложения были бы очень благодарны, спасибо.

4b9b3361

Ответ 1

Использовать комментарий PHPDoc на уровне класса - особенно тег @method - отлично работает в PhpStorm:

/**
 * @method static someClass get_by_user_id(int $id) Bla-bla
 * @method static someClass get_first_by_id(int $id) 
 */
abstract class a {
...

В приведенном выше примере:

  • @method - тег PHPDoc
  • static - указывает, что это статический метод
  • someClass или $this - тип возврата
  • get_by_user_id - имя метода
  • (int $id) - подпись метода: ([[type] [parameter]<, ...>])
  • Bla-bla - некоторое необязательное описание

Подробнее о @method:

P.S. В то время как @method static отлично работает в PhpStorm (сообщает IDE, что метод статичен), он может не быть (пока?), Поддерживаемый фактическим инструментом phpDocumentor (извините, не использовал его какое-то время).


Альтернативно: (в PhpStorm, конечно) Settings | Inspections | PHP | Undefined | Undefined method --> Downgrade severity if __magic methods are present in class - это никак не поможет при завершении кода для таких методов, но не будет отмечать эти магические методы как "undefined метод".


билет phpDocumentor относительно использования регистровых/неполных имен для тегов @property/@method (как это может быть полезно для документации и как небольшая помощь может привести к фактической IDE при работе с кодом завершение):

Ответ 2

Отчасти связано с оригинальным вопросом:

Вы также можете определить это в метафайле phpstorm. Вот пример метода factory (v2016.3):

// Define in .phpstorm.meta.php
namespace PHPSTORM_META {
    $STATIC_METHOD_TYPES = [
        \Factory::create('') => [],
    ];
}

// Then use in code
$factory = new \Factory();
$user = $factory->create(\User::class);
// Here you get autocomplete.
$user->subscribe();

Таким образом, вам не нужно выполнять docblock каждую возможность, когда происходит магия.

Подробнее см. docs.