首页 > 解决方案 > 更改类中的构造函数参数后,如何标记任何需要更新的子类?

问题描述

我有一堂课叫PdfRenderer

class PdfRenderer
{
    function __construct(Fpdi $pdf)
    {
        $this->pdf = $pdf;
    }
}

我也有课PdfProposalRenderer

class PdfProposalRenderer extends PdfRenderer
{
    function __construct(Fpdi $pdf, array $filename)
    {
        parent::__construct($pdf);
    }

}

我需要PdfRenderer通过在构造函数中添加一个新参数来更改类:

class PdfRenderer
{
    function __construct(Fpdi $pdf, StreamFactory $streamFactory)
    {
        $this->pdf = $pdf;
        $this->streamFactory = $streamFactory;
    }
}

通常,在此更改之后,我会在代码库中搜索任何出现的“新 PdfRenderer”,如果有,我会更新这些地方的实例化参数。这就是所有需要做的,对吧?还有别的事吗?通常没有?所以这就是我通常停下来的地方。


好吧,现在问题出在这里..我有很多课,我并不总是记得...

在我的情况下PdfProposalRenderer扩展PdfRenderer“,所以我需要进入PdfProposalRenderer和进入construct方法来更新parent::__construct($pdf)行以匹配我在参数中所做的更改PdfRenderer

另外,还有其他扩展的类PdfRenderer吗?也许,我必须检查一下,现在我知道了这一点。

但通常我不运行这样的检查,所以这种类型的更改会丢失,直到PdfProposalRenderer实时代码中断。

问题

有没有办法修改构造函数中PdfProposalRenderer或其他地方的代码,当我更新构造函数参数时PdfRenderer,更痛苦的是,我也需要在那些地方更改它?

例如,有没有办法修改PdfProposalRenderer's constructor say new PdfRenderer`中的代码?

如果没有,除了在代码库中搜索“extends PdfRenderer”然后检查任何“parent::__construct”代码行之外,还有其他方法可以检查该更改吗?

标签: phpoopparametersconstructorextends

解决方案


实施 MER 的建议:

PdfProposalRenderer独自离开并这样做:

class PdfRenderer
{

    function __construct(Fpdi $pdf, StreamFactory $streamFactory = null)
    {
        $this->pdf = $pdf;
        $this->streamFactory = $streamFactory ?? new StreamFactory();
    }
}

另外,在PdfProposalRenderer我决定按名称调用父类,所以而不是

parent::__construct($pdf);

我用了

PdfRenderer::__construct($pdf);

推荐阅读