oop — отсутствует реализация метода в проекте PHP

Недавно у меня был кто-то на сайте проекта PHP (и этот кто-то не хочет мне помочь), поэтому я должен понять его код. И, возможно, мой ответ будет глупым, но …

Но перед классом есть несколько методов, которые документируются, как в примере:

namespace Base\Classes;

/**
* @method int method1()
* @method $this method2(int $parameter)
*/

class SomeClass extends ParentClass
{
public $_s_a = false;
public $_user_roles = [];

public function SomeClassMethod() {
somethingDone();
}
}

И как вы можете видеть в этом примере, эти документированные методы не реализованы в определенном классе. Но о чем мой вопрос — эти методы вызываются из других классов и шаблонов. И PHPStorm (моя IDE) соединяет строки этой документации со звонками, и ctrl+B ведет между ссылками. Но я не могу найти точную реализацию этих методов. Их нельзя найти в родительских классах, их нет в этом файле. И я подумал, может быть, это какой-то синтаксический сахар, с которым я не знаком. Я прав? Или там что-то мне не хватает, а все реализации где-то в другом месте? (поиск по имени метода в папке для меня ничего не дает)

0

Решение

PHP имеет несколько магические методы, и один из них __call().

Когда у вас есть объект, который реализует __call() (самостоятельно или одним из родительских классов), вы можете вызвать недоступный метод для него, и __call() метод будет вызван вместо. Это происходит, например, когда вы вызываете закрытый метод извне или когда вы вызываете метод, который не был определен в коде.

Когда вы используете такие вызовы для недоступных методов, IDE, скорее всего, будут показывать предупреждение о том, что метод не существует, хотя сам код, вероятно, будет работать во время выполнения. Эти предупреждения довольно раздражающие, поэтому вы можете добавить @method тег вашего класса, и IDE будет знать, что этот метод существует, и не будет отображать предупреждение.

Итак, чтобы поддержать код, который вы получили от кого-то, взгляните на __call() Реализация метода. Имейте в виду, что этот метод может быть реализован в одном из родительских классов, поэтому проверьте их также.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]