如何在子类中设置公共属性?

时间:2011-06-06 21:17:19

标签: php

我是OO编程的新手,我正在尝试理解如何以适当的方式从子类为公共属性赋值。我总是每次都以不同的方式做这件事,所以我觉得问你一般的做法是个好主意。

假设我有一个父类 Fruit ,还有两个子类 Apple Banana

    

abstract class Fruit {

    protected $color; //empty property

    protected function getColor(){
        return $this->color;
    }
}

class Apple extends Fruit {
    protected $color = 'red';
}

class Banana extends Fruit {
    protected $color = 'yellow';
}

?>

每个子类必须具有属性 color ,这将在超类中使用函数 getColor

但我如何处理该财产?

  1. 我在父级中定义了空变量$ color。然后我在子类中设置变量$ color,并通过parent :: __ construct将它们传递给父类,以将值赋给父级中的属性。

  2. 我在父级中定义了空变量$ color。然后我只需在子类中使用$ this-> color来设置值。

  3. 我在每个子类中定义属性,并保持原样。继承的方法仍然可以使用它。

  4. 我想最好收集父类中的公共属性,但是编写那么多行来设置一些值就好了(如果我有很多属性,那么就会有还有很多功能参数)。第二和第三部分,但很难看出我实际上需要定义属性。

    我该怎么想?哈哈,我对所有的OO思维方式都很困惑,我几乎没有写任何代码,哈哈。

    谢谢。

3 个答案:

答案 0 :(得分:4)

所有子类都将继承color属性。 protected关键字将确保它继承给子级,但不可用于外部世界。您不需要在孩子中声明$this->color因为它已经存在,所以在您拥有的子类中的方法中为$this->color分配一个值。

答案 1 :(得分:3)

没有“银弹”。通常,应该通过构造函数的参数设置预期在子类中不同的所有字段,以确保它们是显式设置的。可以通过为属性赋值来初始化其他字段。

例如,可以通过为属性赋值来设置水果的颜色(因为许多水果可以是红色),但名称应该由构造函数的参数设置(因为名称唯一标识水果)。

答案 2 :(得分:0)

最佳方式显示在您的列表中 - 为类属性指定默认值。但我可能会在您的代码中使用一些依赖注入的想法,只需将默认值传递给构造函数。