首页 > 解决方案 > 如何为本地目录站点正确扩展类?

问题描述

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

让我们认为我必须制作这五个课程

<?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
}

接着

class company_class extends state_class{
// DO SOME COMPANY STUFF HERE
}

标签: phpoop

解决方案


[...] 关于使用真正的 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
    }
}

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

city_class只知道它自己和它在同一抽象级别的合作者。数据库处于不同的抽象级别,您city_class一定不知道它们。因此,对于数据库访问,您需要一个city_db负责检索数据和构建city_class对象的类。同样,您遵循相同的过程来识别 的不变量和状态city_db,并根据导致从一种状态转换到另一种状态的事件制作方法。


推荐阅读