Intereting Posts
Как эхо «…» после номера 9 и повторять последние два числа после «…» для разбивки на страницы? php parse_url reverse – проанализированный URL-адрес Белое пространство появляется ниже липкого нижнего колонтитула, только в PHP PHP rtrim и ltrim обрезают больше, чем предполагалось Может ли GD сделать текст искаженным (чтобы он выглядел так, будто он слегка обтекает кривую)? PHPMailer из отображается как Root User PHP htmlentities не работает даже с параметрами Хранение паролей для MYSQL в приложении PHP безопасным способом PHP глобальный или $ GLOBALS Скрестить содержимое div с помощью PHP и cURL Пропуск через массивы ввода формы в php Как выполнить привязку LDAP SASL к Active Directory с использованием GSS-API в PHP из Windows? Сравнение временной отметки с текущим временем из базы данных Воспроизвести файл mp4 через php в HTML5 Video Tag в Chrome? Использование нескольких модулей в одном представлении

Как документировать методы магии (_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 в моем примере).

Благодарю вас за любые идеи или предложения.

Использовать комментарии 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 :

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


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


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

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

Вы также можете определить это в метафайле phpstorm. Вот пример заводского метода (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 каждую возможность, когда происходит магия.

Имейте некоторые документы для деталей.