3

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

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

这里需要一点指导。如果它是正确的方式?或者至少可以这样做吗?如果是这样,如何做到这一点...谢谢

4

1 回答 1

6

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

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

如果由我决定,我会避免使用那些神奇的 getter/setter,只需将自己的 getter/setter 方法添加到类中即可。

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

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

  • 总是让你的类名 PascalCase。这并不是使您的代码工作真正需要的,但它遵循经常使用的命名约定
  • 我个人的偏好有点:请始终在您的 foreach 语句中添加花括号。当其他人正在阅读您的代码时,会更清楚发生了什么。
于 2012-08-15T07:53:44.233 回答