Если вы вызываете метод, который не существует в вашем подклассе, PHP будет проходить по иерархии классов, пока не найдет класс-предок, который реализует нужную вам функцию. Это означает, что если ваш класс son
не реализует method_2
, PHP автоматически найдет ближайшего предка, который это сделает. В вашем случае он будет вызывать method_2
из base
, как вы хотите.
Если вы переопределяете method_2
в своем классе son
и хотите создать собственную реализацию method_2
, а также вызвать реализацию base::method_2
тогда вы можете использовать ключевое слово parent
:
class son extends base {
public function method_2() {
parent::method_2();
//do son::method_2()-specific stuff here
}
}
Вы не можете связывать parent
вызовов вместе, поэтому, если base
был подклассом GrandparentClass
, вы не могли бы сделать что-то вроде этого:
parent::parent::method_2(); // trying to call grandparent::method_2
// but this call will fail
Но вы можете напрямую ссылаться на классы предков по имени, так что это будет работать:
GrandparentClass::method_2();
И еще немного подробнее, есть также функция с именем class_parents()
, которая возвращает массив каждого класса-предка, от которого унаследован ваш класс. Это может помочь, если вы хотите вернуться, скажем, к двум предкам, но по какой-то причине вы не знаете его конкретного имени, вы все равно можете вызвать функцию, используя eval()
.
Например, этот код будет вызывать GrandparentClass::method_2()
без прямой ссылки на класс по имени в вашем коде:
$parents = class_parents($this);
eval(end($parents) . "::method_2();");
Надеюсь, это поможет.