Недавно у меня был кто-то на сайте проекта 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
ведет между ссылками. Но я не могу найти точную реализацию этих методов. Их нельзя найти в родительских классах, их нет в этом файле. И я подумал, может быть, это какой-то синтаксический сахар, с которым я не знаком. Я прав? Или там что-то мне не хватает, а все реализации где-то в другом месте? (поиск по имени метода в папке для меня ничего не дает)
PHP имеет несколько магические методы, и один из них __call()
.
Когда у вас есть объект, который реализует __call()
(самостоятельно или одним из родительских классов), вы можете вызвать недоступный метод для него, и __call()
метод будет вызван вместо. Это происходит, например, когда вы вызываете закрытый метод извне или когда вы вызываете метод, который не был определен в коде.
Когда вы используете такие вызовы для недоступных методов, IDE, скорее всего, будут показывать предупреждение о том, что метод не существует, хотя сам код, вероятно, будет работать во время выполнения. Эти предупреждения довольно раздражающие, поэтому вы можете добавить @method
тег вашего класса, и IDE будет знать, что этот метод существует, и не будет отображать предупреждение.
Итак, чтобы поддержать код, который вы получили от кого-то, взгляните на __call()
Реализация метода. Имейте в виду, что этот метод может быть реализован в одном из родительских классов, поэтому проверьте их также.
Других решений пока нет …