Как документировать методы магии (_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 в моем примере).
Любые идеи или предложения были бы очень благодарны, спасибо.
Ответы
Ответ 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.