Почему в модели User используется позднее статическое связывание?
Добрый день, помогите разобраться с вопросом как реализован механизм позднего связывания в модели User, которая описана в Yii2 advanced? Как работает цепочка наследования в выражении static::findOne и в каком контексте функция findOne в результате будет выполнена? Я правильно понимаю, что ключевое слово static здесь создает ссылку на контекст класса User? И если интерпретатор не находит реализации метода findOne он идет дальше по цепочке наследования?
помогите разобраться с вопросом как реализован механизм позднего связывания в модели User, которая описана в Yii2 advanced?
точно так же как и в PHP
Как работает цепочка наследования в выражении static::findOne и в каком контексте функция findOne в результате будет выполнена?
интерпретатор проверяет наличие метода в текущем классе, если он не существует происходит проверка наличия/вызов метода дальше по иерархии наследования
Максима, спасибо за ответ, а в чем преимущество использования позднего связывания именно в User в том виде, как это реализовано в Yii2 в примере? Почему именно этот вариант решения использован? Или так захотели авторы?
rrolegov, вообще всегда лучше использовать позднее связывание вместо self, например в Вашей модели User может быть реализован метод findOne осуществляющий поиск пользователя с учетом его активности, статуса блокировки и прочих необходимых параметров. Собственно позднее связывание и позволяет предусмотреть переопределение методов.
Максим Федоров, ok, понятно теперь. Это сделано с той целью, чтобы у "меня" была возможность определить свою такую же статическую функцию. Я так понимаю, что если я в своей модели User объявил некоторую статическую функцию findOne, то я могу ее использовать как с идентификатором self::, так и с идентификатором static::.
Меня просто спутал идентификатор static:: в дочернем классе, мне казалось, что его логичнее определить в родительском классе. Но потом дошло, что метод-то все равно вызывать нужно в каком-либо контексте, т.е. надо ставить self, но если поставить self::, то нужно обязательно реализовать метод в этом же классе, иначе интерпретатор выдаст ошибку, а если метод не нужно переопределять (чтобы не дублировать код), то достаточно поставить static::, интерпретатор пойдет искать этот метод по иерархии.... Если я наврал, поправьте, пожалуйста.