PHP - расширение метода, например, расширение класса

У меня есть класс 2:

class animal{
    public function walk(){
        walk;
    }
}

class human extends animal{
    public function walk(){
        with2legs;
    }
}

Таким образом, если я вызываю human- > walk(), он работает только с2legs;

Но я хочу запустить родительскую прогулку; тоже.

Я знаю, что могу изменить его так:

class human extends animal{
    public function walk(){
        parent::walk();
        with2legs;
    }
}

Но проблема в том, что у меня много подклассов, и я не хочу помещать parent:: walk(); в каждую прогулку ребенка(). Есть ли способ расширить метод, например, расширить класс? Без переопределения, но действительно расширения метода. Или есть лучшие альтернативы?

Спасибо.

Ответ 1

Я бы использовал понятия "hook" и abstraction:

class animal{

    // Function that has to be implemented in each child
    abstract public function walkMyWay();

    public function walk(){
        walk_base;
        $this->walkMyWay();
    }
}

class human extends animal{
    // Just implement the specific part for human
    public function walkMyWay(){
        with2legs;
    }
}

class pig extends animal{
    // Just implement the specific part for pig
    public function walkMyWay(){
        with4legs;
    }
}

Таким образом, я просто должен позвонить:

// Calls parent::walk() which calls both 'parent::walk_base' and human::walkMyWay()
$a_human->walk();      
// Calls parent::walk() which calls both 'parent::walk_base' and pig::walkMyWay()
$a_pig->walk();

заставить ребенка идти своим путем...


См. Шаблон шаблона.