php - 具有不同数量参数的子类构造函数

标签 php oop class-design abstract-class subclass

在我的应用程序中,我有许多呈现不同的元素。我创建了一个抽象类,它们在其中扩展。

abstract class Element {

    protected $_value = null;

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

    // ...

    public abstract function render();

}

元素的一个示例可能是包裹在段落标记中的一些文本。

class TextElement extends Element {

    public function render() {
        return "<p>{$this->_value}</p>\n";
    }

}

我在创建具有多个值的元素时遇到问题。例如,图像元素可能呈现图像标签并包含多个属性。这是一个问题,因为抽象类中的构造函数只接受一个参数。我看到这个问题有两种可能的解决方案。我可以将包含不同属性的数组传递给 Element 构造函数(解决方案 1),或者我可以覆盖子类中的构造函数(解决方案 2)。我的问题是,这些解决方案中哪一个是更好的设计,或者它们是否存在更好的解决方案?我应该改用接口(interface)吗?

解决方案一

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'));

方案二

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}\" />";
    }

}

最佳答案

对于第一个解决方案,如果有人要查看您的代码,他们将需要检查渲染函数以找出可用的参数。

使用第二种解决方案,如果您的 IDE 支持自动完成,或者如果您从源代码生成文档,您将获得一个参数列表,您可以更快地度过一天。

$value 并没有真正告诉我它的用途,如果你遇到一个没有任何参数的元素怎么办?即 BR 元素或其他东西。

我认为解决方案 2 更“正确”,但只有“渲染”功能的界面才是最佳解决方案。

关于php - 具有不同数量参数的子类构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5932897/

相关文章:

r - "S3 methods"在R中是什么意思?

c++ - 在 C++ 中的另一个类中初始化类?

c++ - 从基类中选择子类......可能吗?

php - 使用Monolog的ExceptionHandler时如何显示异常?

php - 如何通过映射3个表在mysql中创建 View ?

php - mysqli_connect() : (HY000/2002): Connection refused using ipv6 address

oop - 2D 和 3D 向量的正确类层次结构

java - 如何访问线程内的类

c# - 在C#类库中传递上下文,在不使用static的情况下寻找 "easy"的方式

php - 如何在 Laravel Eloquent 中使用带有子查询的内连接