bir*_*ric 5 php oop abstract-class class-design subclass
在我的应用程序中,我具有许多呈现不同效果的元素。我创建了一个抽象类,它们在其中进行了扩展。
abstract class Element {
protected $_value = null;
public function __construct($value) {
$this->_value = $value;
}
// ...
public abstract function render();
}
Run Code Online (Sandbox Code Playgroud)
元素的示例可能是一些包含在段落标签中的文本。
class TextElement extends Element {
public function render() {
return "<p>{$this->_value}</p>\n";
}
}
Run Code Online (Sandbox Code Playgroud)
我在创建具有多个值的元素时遇到了麻烦。例如,图像元素可能会渲染图像标签并包含多个属性。这是一个问题,因为抽象类中的构造函数仅接受一个参数。我看到了两个可能的解决方案。我可以将包含不同属性的数组传递给Element构造函数(解决方案1),也可以覆盖子类中的构造函数(解决方案2)。我的问题是,这些解决方案中的哪一个是更好的设计,或者它们是否存在更好的解决方案?我应该改用接口吗?
解决方案1
class ImageElement extends Element {
public function render() {
return "<img src=\"{$this->_value['src']}\" alt=\"{$this->_value['alt']}\" />";
}
}
$imageElement = new ImageElement(array('src' => '/image.png', 'alt' => 'image'));
Run Code Online (Sandbox Code Playgroud)
解决方案2
class ImageElement extends Element {
protected $_alt;
public function __construct($src, $alt) {
$this->_value = $src;
$this->_alt = $alt;
}
// ...
public function render() {
return "<img src=\"{$this->_value}\" alt=\"{$this->_alt}\" />";
}
}
Run Code Online (Sandbox Code Playgroud)
使用第一个解决方案,如果有人要查看您的代码,他们将需要检查渲染函数以找出可用的参数。
使用第二种解决方案,如果您的 IDE 支持自动完成,或者如果您从源生成文档,您将获得一个参数列表,您可以更快地度过这一天。
$value 并没有真正告诉我它的用途,以及如果遇到没有任何参数的元素怎么办?即 BR 元素或其他东西。
我认为解决方案 2 更“正确”,但只有“渲染”功能的界面才是最好的解决方案。