Пример на сайте не очень наглядный, но ошибок в нем нет и полиморфизм он вполне иллюстрирует (в переопределении метода
method2
).
Декларацию переменной действительно можно заменить на метод, который принимает экземпляр
A
и всех его дочерних классов: для наглядности так будет лучше, но в остальном отличий мало. (Мой код на TypeScript, но его смысл понятен, думаю.)
class A {
someMethod(): string {
return "A";
}
}
class B extends A {
someMethod(): string {
return "B";
}
}
function callSomeMethod(object: A) {
console.log(object.someMethod());
}
callSomeMethod(new A()); // "A"
callSomeMethod(new B()); // "B"
Можно обойтись и без функции, если явно указать тип переменной (и если PHP так позволяет):
const objectWithSomeMethod: A = new B();