Подтвердить что ты не робот

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

Я сижу на большой базе кода, которая содержит несколько классов, которые раскрывают функциональность с помощью магически реализованных методов (используя __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, похоже, работает, я должен предположить, что в настоящее время существует несколько проблем с этим подходом, потому что мне потребовалась небольшая работа, чтобы справиться с этими связанными ошибками:

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

4b9b3361

Ответ 1

Хорошо, вы можете перейти в меню предпочтений, в разделе "Инспекции", перейти к Undefined → Undefined "Метод" и проверить Степень понижения, если присутствуют __магические методы.

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

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

enter image description here

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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