Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 派生类应该覆盖构造函数中的父属性还是外部的父属性?_Php_Oop - Fatal编程技术网

Php 派生类应该覆盖构造函数中的父属性还是外部的父属性?

Php 派生类应该覆盖构造函数中的父属性还是外部的父属性?,php,oop,Php,Oop,派生类可以通过在属性声明中初始化继承属性的值或在构造函数中设置继承属性的值来重写继承属性的值。无论哪种方式,结果都是一样的 这两种方法是否存在语义差异,或有任何明显的优势? 还是仅仅是可读性和个人偏好的问题 这里有一个(公认是人为的)例子来说明这两种方法: IdNumber对象是专用的Number对象。除其他差异外,它们设置了一个特定的默认最小值,而父类没有: 我刚刚想到的IdNumberA中使用的方法的一个优点是,可以很容易地记录默认值,以便与PHPDocumentor或其他工具一起使用。在这

派生类可以通过在属性声明中初始化继承属性的值或在构造函数中设置继承属性的值来重写继承属性的值。无论哪种方式,结果都是一样的

这两种方法是否存在语义差异,或有任何明显的优势?
还是仅仅是可读性和个人偏好的问题

这里有一个(公认是人为的)例子来说明这两种方法:
IdNumber
对象是专用的
Number
对象。除其他差异外,它们设置了一个特定的默认最小值,而父类没有:


我刚刚想到的
IdNumberA
中使用的方法的一个优点是,可以很容易地记录默认值,以便与PHPDocumentor或其他工具一起使用。在这种情况下,您可能应该使用组合而不是继承,以遵循开闭原则。此外,这个话题已经讨论过很多次了,所以你可以简单地在谷歌上搜索“继承破坏封装”继承与组合可以是一个有趣的哲学讨论,但这里有点离题。如果您发现这个特定的问题已经讨论了很多次,我将非常感谢您提供的链接。这里有一些链接:,我提到继承与组合的原因是为了警告您要小心,不要打破开闭原则(因为您的第二个示例很有诱惑力这么做).我刚刚想到的
IdNumberA
中使用的方法的一个优点是,可以很容易地记录默认值,以便与PHPDocumentor或其他工具一起使用。在这种情况下,您可能应该使用组合而不是继承,以遵循开闭原则。此外,这个话题已经讨论过很多次了,所以你可以简单地在谷歌上搜索“继承破坏封装”继承与组合可以是一个有趣的哲学讨论,但这里有点离题。如果您发现这个特定的问题被讨论了很多次,我将非常感谢您提供的链接。这里有一些链接:,我提到继承与组合的原因是为了警告您要小心,不要打破开闭原则(因为您的第二个示例很容易这样做)。
class Number
{
    protected $value;
    protected $minValue;
    public function __construct ($value)
    {
        $this->value = $value;
    }
    public function setMinValue ($min)
    {
        $this->minValue = $min;
    }
    public function isValid ()
    {
        if (isset($this->minValue)) {
            return $this->value >= $this->minValue;
        } else {
            return true;
        }
    }
}

class IdNumberA extends Number
{
    protected $minValue = 1;  //
    /* ...plus more specialized methods... */
}

class IdNumberB extends Number
{
    public function __construct ($value)
    {
        $this->minValue = 1;
        parent::__construct($value);
    }
    /* ...plus more specialized methods... */
}