Я сижу на большой базе кода, которая содержит несколько классов, которые раскрывают функциональность с помощью магически реализованных методов (используя __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 присутствуют в классе», но я бы предпочел:
Возможно ли что-либо из вышеперечисленного? Если да, то как?
Дополнительный вопрос о бонусе: рассмотрите случай, когда вызовы методов привязаны.
$f = new Foo; $f->test()->chain()->moreChain(); // potentially runs fine
Предполагая, что волшебный вызов $f->test()
возвращает что-то подходящее, последующие (возможно, но не обязательно, также магические) вызовы будут работать нормально. Однако, поскольку я не знаю, как сообщить IDE, что возвращает test()
флаги остальной части цепочки вызовов также будут заполнены недостающими методами. И, что еще хуже, параметр «понижающая степень серьезности» не применяется к этим предупреждениям, поскольку среда IDE не знает, какой класс эти промежуточные объекты должны быть.
Есть ли решение, которое может также охватывать этот случай?
Несмотря на то, что документирование магических методов с @method
аннотаций @method
похоже, работает, я должен предположить, что в настоящее время существует несколько проблем с этим подходом, потому что мне потребовалась небольшая работа, чтобы справиться с этими связанными ошибками:
Надеюсь, они исправит их в разумные сроки.
Ну, вы можете пойти в меню предпочтений, в разделе « Инспекции» , перейти к « Не определено» -> «Неопределенный метод» и проверить степень серьезности, если существуют __магматические методы .
Это сделает флаг менее суровым (вместо Warning, as Info), который все равно даст вам зеленый свет на проверку вашего документа.
Я ничего не знаю из-за того, что @property
или @method
PHPDoc для целевого класса для каждого метода, который, вероятно, будет использоваться.
Вместо того, чтобы глобально отключать проверки, понижая степень проверки, вы можете добавить комментарий к одной строке, чтобы игнорировать именно эту конкретную проверку.
/** @noinspection PhpUndefinedMethodInspection */ Assertion::NullOrAssertionDoesNotExist();
Основываясь на том, что сказал Мадара, я обнаружил, что он не будет понижаться настолько далеко, насколько мне нравится, независимо от того, какую серьезность я ему задал, поэтому я сделал новую серьезность для неопределенного метода, который не имеет каких-либо атрибутов , и выключил галочку downgrade ( см. рисунок ниже)
Если я надвигаюсь на свои магические методы, он все равно вызывает всплывающее сообщение, но в остальном это не отвлекает меня. На один шаг лучше, чем просто отключить проверку, потому что по крайней мере таким образом фактический неопределенный метод все еще можно обнаружить, наведя указатель мыши на имя
Вы можете использовать динамическую переменную:
$test = 'test'; $chaine = $f->$test(); // no phpStorm flag, & the code works