我是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
}
答案 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
的不变式和状态,并从导致从一种状态转换到另一种状态的事件中找出方法。