PHP: обходной путь для повторного использования модифицированного частного родительского метода - PullRequest
2 голосов
/ 05 августа 2020

Мне нравится изменять один частный метод унаследованного класса.

Вот мои требования:

  • Я не могу изменить родительский класс.
  • Мне нужно повторно использовать код унаследованного класса.
  • Мне нужно добавить некоторый код перед кодом частного метода родителя.

В основном мне нравится этот код

<?php

class ParentClass
{
    public function doStuff()
    {
        echo 'Doing parent stuff';

        $this->doPrivateStuff();

        echo 'Doing more parent stuff';
    }

    private function doPrivateStuff()
    {
        echo 'Doing private stuff';
    }
}

class ChildClass extends ParentClass
{
    private function doPrivateStuff()
    {
        echo 'Additional code';

        parent::doPrivateStuff();
    }
}

$obj = new ChildClass;
$obj->doStuff();

?>

для вывода

Doing parent stuff
Additional code
Doing private stuff
Doing more parent stuff

вместо

Doing parent stuff
Doing private stuff
Doing more parent stuff

Я знаю, что мой код «не работает», потому что doPrivateStuff является частным методом.

Какой обходной путь лучше всего использовать для повторного использования модифицированной версии частного метода?

PS:

Мой текущий обходной путь - реализовать методы doStuff и doPrivateStuff в моем ChildClass путем анализа тел родительских методов посредством отражения и eval их обработки.

Я не считаю это «чистым» подходом, кхм. Так что я рад прочитать ваши рекомендации.

1 Ответ

0 голосов
/ 05 августа 2020

Сделайте так:

<?php

class ParentClass
{
    public function doStuff()
    {
        // Some code

        $this->doPrivateStuff();

        // More code
    }

    private function doPrivateStuff()
    {
        echo 'Doing private stuff';
    }
}

class ChildClass extends ParentClass
{
    public function doStuff()
    {
        echo 'Additional code';

        parent::doStuff();
    }
}

$obj = new ChildClass;
$obj->doStuff();

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...