使用父类方法填充的子类属性

时间:2012-08-15 07:42:08

标签: php oop inheritance

我是PHP新手,刚进入OOP。我有几个用于设置和获取属性的泛型方法。我几乎在所有类中经常使用它们,我将这些方法放在一个类中并从中扩展其他类。现在我可以从子类访问方法,但不知道如何通过它们设置和获取子类的属性... parent class base.php

class Base
{
    public function __construct()
    {
    }

    function __set($propName, $propValue)
    {
        $this->$propName = $propValue;
    }

    function setProperties(array $data)
    {
        foreach($data as $propName => $propValue)
            $this->$propName = $propValue;
    }

    function __get($propName)
    {
        return (isset($this->$propName))? $this->$propName : "Invalid property!";
    }

    function getProperties(array $properties)
    {
        foreach($properties as $propName)
            $propVals[$propName] = $this->$propName;
        return $propVals;
    }
}

子类category.php

class categories extends Base
{

    private $id;
    private $pid;
    private $title;
    private $status;

    public function __construct()
    {
        parent::__construct();  
    }
}

我称之为

$objCat = new categories();

$objCat->setProperties(array('id'=>'10', 'pid'=>'6'));

print_r( $objCat->getProperties(array('id', 'pid')));

这里需要的指导很少。如果它是正确的方式?或者至少可以这样做吗?如果是这样的话怎么做... 感谢

1 个答案:

答案 0 :(得分:6)

当您可以说课程categories是班级Base时,您只想扩展班级。像你所拥有的那种实用类似的东西几乎总是错误的方式。 PHP还为复制/粘贴代码引入了一个名为traits的东西。然而,我个人的偏好是,这是你永远不会想要使用的东西,因为它将特质与你的课程紧密结合,这是你想要避免的。

有关详情,请参阅Liskov Substitution principle中的SOLID programming

如果由我决定,我会以任何方式避免那些神奇的getter / setter,只需在课堂上添加你自己的getter / setters方法。

关于某些基类的错误不仅仅是你正在做的事情(即使我过去也曾这样做过)。考虑一些课程Database和课程Article。因为Article类需要访问数据库,所以很多人都让类扩展Database类。这是不正确的,因为文章不是数据库。相反,应使用dependency injection将数据库类的实例注入到文章类中。应该将实例注入到类构造函数中(如果所有或许多方法都需要访问它)或者只需要注入需要它的方法。因此,在扩展课程时,您必须能够说B类是A类。

关于您的代码的其他一些说明:

  • 始终将您的班级名称命名为PascalCase。这不是真正需要使您的代码工作,但它遵循naming convention often used
  • 我的个人偏好:请始终在你的foreach语句中添加花括号。当其他人阅读您的代码时,会更清楚地发生了什么。