Хотя вы вызываете parent::singleton()
из sub
класса, но singleton()
все равно создает вам экземпляр base
класса (потому что вы делаете new base()
), у которого нет вашего foo()
метода.
Как правило, вы не должны использовать / вызывать какие-либо методы из базового класса, которые не определены в нем. Потому что это делает ваш код не чистым: что если вы реализуете какой-то другой класс, который расширяет ваш класс base
, но забывает реализовать метод foo()
? Вы можете получить фатальные ошибки довольно быстро ...
Если вы уверены, что этот метод foo()
всегда будет реализован любым дочерним классом - вы можете определить его как абстрактный метод в базовом классе - тогда любой дочерний класс будет вынужден реализовать его. Или, по крайней мере, как пустой метод в том же базовом классе ... Таким образом, ваш код будет чистым и структурированным.