Я сижу на большой базе кода, которая содержит несколько классов, которые раскрывают функциональность с помощью магически реализованных методов (используя __call
и __callStatic
). Например:
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 присутствуют в классе", но я бы предпочел либо:
- полностью отключить эту функцию только для определенных классов или
- работать с IDE, а не против него - предоставить ему информацию, которую я уже имел, чтобы наши взгляды совпадали.
Возможно ли какое-либо из вышеперечисленных? Если да, то как?
Дополнительный вопрос о бонусе: рассмотрите случай, когда вызовы методов привязаны.
$f = new Foo;
$f->test()->chain()->moreChain(); // potentially runs fine
Предполагая, что магический вызов $f->test()
возвращает что-то соответствующее, последующие (возможно, но не обязательно, также магические) вызовы будут работать нормально. Однако, поскольку я не знаю, как сообщить IDE, что возвращает test()
, это означает, что остальная часть цепочки вызовов также заполнена отсутствующими методами. И, что еще хуже, параметр "понижающая степень серьезности" не относится к этим предупреждениям, так как среда IDE не знает, какой класс эти промежуточные объекты должны быть.
Есть ли решение, которое может также охватывать этот случай?
Update
Несмотря на то, что документирование магических методов с помощью аннотаций @method
, похоже, работает, я должен предположить, что в настоящее время существует несколько проблем с этим подходом, потому что мне потребовалась небольшая работа, чтобы справиться с этими связанными ошибками:
- Тип hinting для аргументов метода не работает корректно с примитивами
- Аннотации работают для одного вызова, но не для цепочки вызовов
Я надеюсь, что они исправит их в разумные сроки.