如何正确扩展本地目录站点的类?

时间:2018-08-12 15:56:38

标签: php oop

我是OOP的新手,并且在一个本地目录网站上工作,您可以在其中搜索本地商店和公司。我必须创建一些类,例如string_class(将处理字符串),city_class(将处理城市),state_class(将处理州),{{1} }(将处理公司类别)和category_class(将处理公司)。现在,我对于使用真正的OOP概念从哪里开始和从哪里结束感到困惑。

让我们认为我必须参加这五个课程

company_class

现在您认为我应该扩展字符串类来制作城市类吗? 像

<?php 
class string_class(){

}

class city_class(){

}

class state_class(){

}

class category_class(){

}

class company_class(){

}      `
?>

然后

class city_class extends string_class{
// DO SOME CITY STUFF HERE
}

然后

class state_class extends city_class{
// DO SOME STATE STUFF HERE
}

1 个答案:

答案 0 :(得分:0)

  

[...]关于使用OOP真正概念的起点和终点

您需要确定类的不变量;也就是说,对于类的实例必须始终为真的条件。在您的示例中,您要阻止创建没有正确城市名称的city_class对象。所以-

class city_class {
    function __construct($name) {
        if (!$this->validate_city($name)) 
            throw new city_exception();
    }
}

接下来,您需要列出对city_class对象有效的状态。例如,它们可能是“新的”,“保存的”,“更新的”和“删除的”。

要使对象从一种状态转换为另一种状态,必须发生某个事件(或触发器)。例如,当您第一次创建对象时,其状态是新的。当您的对象保存到数据库时,其状态变为“已保存”;当对象的属性改变时,其状态变为“已更新”;等等。

请注意,每次转换都需要执行一项操作才能进入下一个状态;例如,创建动作需要达到“新”状态;需要采取保存操作才能达到“保存”状态;等等。因此,您可以使用这些操作为类创建方法。

class city_class {
    var $saved;
    var $name;

    function __construct($name) {
        if (!$this->validate_city($name)) 
            throw new city_exception();
        $this->name = $name;
    }

    function save() {
        $this->saved = true;
    }

    function update($new_name) {
        if (!$this->validate_city($new_name)) 
            throw new city_exception();
        $this->name = $new_name;
        $this->saved = false; // updated state
    }
}

在您的评论中,您列出了city_class的责任,即从数据库中获取“ id和名称”,这不是正确的OO设计。

您的city_class仅在相同的抽象级别上了解自己及其合作者。数据库处于不同的抽象级别,您的city_class一定不了解它们。因此,对于数据库访问,您将需要一个city_db类,该类负责检索数据并构建city_class对象。同样,您将遵循相同的过程来识别city_db的不变式和状态,并从导致从一种状态转换到另一种状态的事件中找出方法。