Intereting Posts
Catch не работает и как отключить обработчик исключений php: нажатие на массив, который может или не может существовать Перенаправить вывод из команды в пакетном файле, выход которого уже перенаправлен? Межпроцессная коммуникация внутри PHP с непрерывным процессом? Как вызвать анонимную функцию PHP с различным порядком аргументов Подключение к удаленному серверу MySQL с помощью SSL с PHP Программно изменяющийся хэш файла без его развращения Как получить полный путь к файлу при загрузке файлов в PHP? Создание XML-карты сайта с PHP Получить правильный час для отметки времени UNIX Как использовать контроллеры модулей в Kohana 3? Как выбрать идентификатор строки mysql для предложения WHERE в UPDATE, INSERT, DELETE через php? Как создать пользовательские файлы php.ini для каждого виртуального хоста? POST / Redirect выбрасывает ошибку браузера «Соединение было сброшено» Как получить каталог PHP Uploads?

Как бороться с предупреждением «метод не найден в классе» для магически реализованных методов?

Я сижу на большой базе кода, которая содержит несколько классов, которые раскрывают функциональность с помощью магически реализованных методов (используя __call и __call ). Например:

 class Foo { public function __call($name, $parameters) { echo "You called $name().\n"; } } $f = new Foo; $f->test(); // runs fine, but PhpStorm flags as a warning 

Проблема в том, что PhpStorm считает, что метод test() не существует, поэтому он дает предупреждение на сайте вызова. Это немного раздражает, так как, конечно, код будет работать и вести себя так, как ожидалось.

Я уже настроил серьезность, проверив «серьезность понижения, если параметры __magic присутствуют в классе», но я бы предпочел:

  1. полностью отключить эту функцию только для определенных классов или
  2. работать с IDE, а не против него – предоставить ему информацию, которую я уже имею, чтобы наши взгляды соглашались

Возможно ли что-либо из вышеперечисленного? Если да, то как?

Дополнительный вопрос о бонусе: рассмотрите случай, когда вызовы методов привязаны.

 $f = new Foo; $f->test()->chain()->moreChain(); // potentially runs fine 

Предполагая, что волшебный вызов $f->test() возвращает что-то подходящее, последующие (возможно, но не обязательно, также магические) вызовы будут работать нормально. Однако, поскольку я не знаю, как сообщить IDE, что возвращает test() флаги остальной части цепочки вызовов также будут заполнены недостающими методами. И, что еще хуже, параметр «понижающая степень серьезности» не применяется к этим предупреждениям, поскольку среда IDE не знает, какой класс эти промежуточные объекты должны быть.

Есть ли решение, которое может также охватывать этот случай?

Обновить

Несмотря на то, что документирование магических методов с @method аннотаций @method похоже, работает, я должен предположить, что в настоящее время существует несколько проблем с этим подходом, потому что мне потребовалась небольшая работа, чтобы справиться с этими связанными ошибками:

  • Тип hinting для аргументов метода не работает правильно с примитивами
  • Аннотации работают для одного вызова, но не для цепочки вызовов

Надеюсь, они исправит их в разумные сроки.

Solutions Collecting From Web of "Как бороться с предупреждением «метод не найден в классе» для магически реализованных методов?"

Ну, вы можете пойти в меню предпочтений, в разделе « Инспекции» , перейти к « Не определено» -> «Неопределенный метод» и проверить степень серьезности, если существуют __магматические методы .

Это сделает флаг менее суровым (вместо Warning, as Info), который все равно даст вам зеленый свет на проверку вашего документа.

Я ничего не знаю из-за того, что @property или @method PHPDoc для целевого класса для каждого метода, который, вероятно, будет использоваться.

введите описание изображения здесь

Вместо того, чтобы глобально отключать проверки, понижая степень проверки, вы можете добавить комментарий к одной строке, чтобы игнорировать именно эту конкретную проверку.

  /** @noinspection PhpUndefinedMethodInspection */ Assertion::NullOrAssertionDoesNotExist(); 

Основываясь на том, что сказал Мадара, я обнаружил, что он не будет понижаться настолько далеко, насколько мне нравится, независимо от того, какую серьезность я ему задал, поэтому я сделал новую серьезность для неопределенного метода, который не имеет каких-либо атрибутов , и выключил галочку downgrade ( см. рисунок ниже)

введите описание изображения здесь

Если я надвигаюсь на свои магические методы, он все равно вызывает всплывающее сообщение, но в остальном это не отвлекает меня. На один шаг лучше, чем просто отключить проверку, потому что по крайней мере таким образом фактический неопределенный метод все еще можно обнаружить, наведя указатель мыши на имя

Вы можете использовать динамическую переменную:

 $test = 'test'; $chaine = $f->$test(); // no phpStorm flag, & the code works