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

Sha*_*hah 3 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

子类category.php

class categories extends Base
{

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

    public function __construct()
    {
        parent::__construct();  
    }
}
Run Code Online (Sandbox Code Playgroud)

我称之为

$objCat = new categories();

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

print_r( $objCat->getProperties(array('id', 'pid')));
Run Code Online (Sandbox Code Playgroud)

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

Pee*_*Haa 6

扩展一个类是你唯一想做的事时,你可以说一些类categories是一类Base.像你所拥有的那种实用类似的东西几乎总是错误的方式.PHP也有推出一些所谓的特质复制/粘贴代码.然而,我个人的偏好是,它是你永远不会想要使用的东西,因为它将特质与你的课程紧密结合,这是你想要避免的.

更多信息请参见该Liskov替换原则,扎实的编程.

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

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

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

  • 总是让你的类名PascalCase.这不是真正需要使您的代码工作,但它遵循经常使用命名约定.
  • 我的个人偏好有点:请总是在你的foreach语句中添加大括号.当其他人阅读您的代码时,更清楚的是发生了什么.