php - 如何为本地目录站点正确扩展类?
问题描述
我是 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
}
解决方案
[...] 关于使用真正的 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
,并根据导致从一种状态转换到另一种状态的事件制作方法。
推荐阅读
- django - 如何在基于分类的视图中使用 GET 和查询集?
- java - 如何在 JFrame 中查找某个像素的颜色?
- javascript - Chrome 扩展:如何从 onMessage 本地范围函数分配全局值
- filenet-p8 - FileNet 更改文档类安全性未更新
- javascript - 制作一个按钮,该按钮可以转到不同选项卡上“div”的页面位置,但选项卡位于同一页面中
- ios - 如何在第三张图片上放置一个按钮?
- java - 流收集操作可以是特定的 POJO 而不是 Map 吗?
- python - 递增数据后,发送给用户的 Discord 消息关闭 1
- css - 在样式组件中覆盖子样式的最佳方法
- cuda - 使用自定义类型获取 Cuda 纹理