php - 扩展一个 PHP 类及其子类
问题描述
在我的一个项目中,我使用了一个提供两个类的外部库:DrawingImage
和DrawingCharset
,它们都扩展了BaseDrawing
.
我想扩展BaseDrawing
以添加一些属性并更改现有方法。DrawingImage
但我也希望在现有孩子(和DrawingCharset
)的“副本”中进行这些修改。
有一个简单的方法吗?扩展似乎不是一个解决方案:我必须在每个子类之间复制代码。而且我不确定我是否可以通过 Trait 调用父方法。
解决方案
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();
推荐阅读
- javascript - 如何访问数组对象的元素?
- android - recyclerView 第一次滚动不流畅
- apache-zookeeper - ZooKeeper 超时 - 找不到 myid 文件。视窗服务器 2016
- firebase - Firebase 通知单击 Intent 在背景状态上显示 null - Xamarin.forms Android
- angular - 单击时未显示引导吐司(Angular)
- android - 如何从 Android 应用程序在 Blackberry Access 中打开 URL
- javascript - 如何使用 express.js pg.Pool 调用 Postgres 函数
- angular - 如何使用相同的 url 重新加载一个组件
- typescript - 开玩笑:TypeError:无法读取未定义的属性“foo”
- javascript - Javascript HTMLCollection 使用切片进行数组。为什么它有效?