【问题标题】:PHP: Workaround to reuse modified private parent methodPHP:重用修改后的私有父方法的解决方法
【发布时间】:2020-08-05 01:41:19
【问题描述】:

我喜欢修改继承类的一个私有方法。

这些是我的要求:

  • 我无法修改父类。
  • 我必须重用继承类的代码。
  • 我需要在父类的私有方法代码之前附加一些代码。

基本上我喜欢这段代码

<?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();

?>

输出

做父母的事 附加代码 做私事 做更多父母的事情

而不是

做父母的事 做私事 做更多父母的事情

我知道我的代码“失败”了,因为 doPrivateStuff 是一个私有方法。

重用私有方法的修改版本的最佳解决方法是什么?

PS:

我目前的解决方法是通过反射和evaluating 解析父方法的主体,在我的ChildClass 中实现方法doStuffdoPrivateStuff

我并不完全认为这是一种“干净”的方法,咳咳。所以我很高兴阅读您的建议。

【问题讨论】:

  • 感谢您的评论,@Phil!这表明我的例子不够清楚。您建议的方法不起作用,因为parent::doStuff 不仅仅是输出一行。请看我固定的例子!

标签: php oop


【解决方案1】:

这样做:

<?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();

?>

【讨论】:

  • 谢谢,@Sébastien!可悲的是,这行不通。我的例子不清楚,对不起。请参阅我的comment 和固定示例。
  • 想要达到的目标是不可能的。即具有私有功能的 OOP 原则。唯一的方法是在 ParentClass 中添加一个新函数以在 ChildClass 中覆盖
  • 我不会说这是不可能的。诚然,您无法通过 PHP 风格的继承实现我想要的代码重用,但有一些变通方法。我在问题的最后提出了一个。我想知道是否有一个不那么“hacky”的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多