首页 > 解决方案 > 扩展一个 PHP 类及其子类

问题描述

在我的一个项目中,我使用了一个提供两个类的外部库:DrawingImageDrawingCharset,它们都扩展了BaseDrawing.

我想扩展BaseDrawing以添加一些属性并更改现有方法。DrawingImage但我也希望在现有孩子(和DrawingCharset)的“副本”中进行这些修改。

有一个简单的方法吗?扩展似乎不是一个解决方案:我必须在每个子类之间复制代码。而且我不确定我是否可以通过 Trait 调用父方法。

标签: php

解决方案


Traits 可以访问超类的属性和方法,就像导入它们的子类一样,因此您绝对可以在 BaseDrawing 的子类中添加新功能。

<?php
class BaseDrawing
{
    public $baseProp;

    public function __construct($baseProp)
    {
        $this->baseProp = $baseProp;
    }

    public function doSomething()
    {
        echo 'BaseDrawing: '.$this->baseProp.PHP_EOL;
    }
}

class DrawingImage extends BaseDrawing
{
    public $drawingProp;

    public function __construct($baseProp, $drawingProp)
    {
        parent::__construct($baseProp);
        $this->drawingProp = $drawingProp;
    }

    public function doSomething()
    {
        echo 'DrawingImage: '.$this->baseProp.' - '.$this->drawingProp.PHP_EOL;
    }
}

class DrawingCharset extends BaseDrawing
{
    public $charsetProp;

    public function __construct($baseProp, $charsetProp)
    {
        parent::__construct($baseProp);
        $this->charsetProp = $charsetProp;
    }

    public function doSomething()
    {
        echo 'DrawingCharset: '.$this->baseProp.' - '.$this->charsetProp.PHP_EOL;
    }
}

/**
 * Trait BaseDrawingEnhancements
 * Adds new functionality to BaseDrawing classes
 */
trait BaseDrawingEnhancements
{
    public $traitProp;

    public function setTraitProp($traitProp)
    {
        $this->traitProp = $traitProp;
    }

    public function doNewThing()
    {
        echo 'BaseDrawingEnhancements: '.$this->baseProp.' - '.$this->traitProp.PHP_EOL;
    }
}

class MyDrawingImageImpl extends DrawingImage
{
    // Add the trait to our subclass
    use BaseDrawingEnhancements;
}

class MyDrawingCharsetImpl extends DrawingCharset
{
    // Add the trait to our subclass
    use BaseDrawingEnhancements;
}

$myDrawingImageImpl = new MyDrawingImageImpl('Foo', 'Bar');
$myDrawingImageImpl->setTraitProp('Wombats');

$myDrawingCharsetImpl = new MyDrawingCharsetImpl('Bob', 'Alice');
$myDrawingCharsetImpl->setTraitProp('Koalas');

$myDrawingImageImpl->doSomething();
$myDrawingCharsetImpl->doSomething();

$myDrawingImageImpl->doNewThing();
$myDrawingCharsetImpl->doNewThing();

推荐阅读