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


Child class properties populated with parent class methods

我是PHP的新手,刚进入OOP。我有几个通用方法来设置和获取属性。我几乎在所有类中都经常使用它们,我将这些方法放在一个类中并从中扩展其他类。现在我可以从子类访问方法,但不知道如何通过它们设置和获取子类的属性......父类库.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;
    }
}

子类类别.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')));

这里几乎不需要指导。如果这是正确的方法?或者至少可以这样做吗?如果是这样,如何完成此操作...谢谢

扩展类是你只想做的事情,当你可以说类categories是一个类Base .像你在那里拥有的那种实用程序类几乎总是错误的方式。PHP 还引入了一种称为复制/粘贴代码的特征的东西。然而,我个人的偏好是,它是你永远不想使用的东西,因为它将特质与你的类紧密结合,这是你想要避免的。

有关更多信息,请参阅 SOLID 编程中的 Liskov 替换原则。

如果由我决定,我会避免那些魔术获取者/二传手,而只是将您自己的获取者/二传手方法添加到类中。

关于某些基类的错误不仅仅是你自己在做的事情(甚至我过去也做过)。想想一些班级Database和一个班级Article。由于 Article 类需要访问数据库,因此许多人允许该类扩展Database类。这是不正确的,因为文章不是数据库。相反,应使用依赖关系注入将数据库类的实例注入到项目类中。实例应注入到类构造函数中(如果所有或许多方法都需要访问它),或者只注入需要它的方法。因此,在扩展类时,您必须能够说类 B 是类 A。

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

  • 始终将类名命名为 PascalCase。这实际上并不是使代码正常工作所必需的,但它遵循经常使用的命名约定。
  • 我个人的偏好是:请始终在您的 foreach 语句中添加大括号。当其他人阅读您的代码时,会发生什么更清楚。