Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 什么是确保通用搜索查询中正确子类的策略?_Php_Mysql_Oop_Design Patterns - Fatal编程技术网

Php 什么是确保通用搜索查询中正确子类的策略?

Php 什么是确保通用搜索查询中正确子类的策略?,php,mysql,oop,design-patterns,Php,Mysql,Oop,Design Patterns,这是一个概括的场景。我有“任务”和“任务事件”,我已经为每个任务创建了一个数据库表。我还创建了一个模型,用于处理从数据库中获取记录 对于“任务事件”,我有几种类型:创建、接受、注释和关闭 目前,我做了一些简单的事情,比如$task=newtask($task\u id)从数据库中获取任务,并且$task\u events=新任务\u events($task\u id)它捕获该任务的事件。然后,我实现了迭代器,这样我就可以做foreach($e){…}这一切都很好 但是,我发现对于一些事件类型,

这是一个概括的场景。我有“任务”和“任务事件”,我已经为每个任务创建了一个数据库表。我还创建了一个模型,用于处理从数据库中获取记录

对于“任务事件”,我有几种类型:创建、接受、注释和关闭

目前,我做了一些简单的事情,比如
$task=newtask($task\u id)
从数据库中获取任务,并且
$task\u events=新任务\u events($task\u id)它捕获该任务的事件。然后,我实现了迭代器,这样我就可以做
foreach($e){…}
这一切都很好

但是,我发现对于一些事件类型,我需要一些专门的处理程序。例如,我创建了Tasks\u Events\u Comments,它扩展了Tasks\u Events,并对注释事件类型进行了一些额外的处理。我现在意识到,当我收集事件集合时,我真的需要它们是子类型,因此,如果对事件调用方法,则会调用子类型的正确重写

下面是一个简单的例子:

class Model {
    public function __construct($search = null) {
        // Hypothetical example, basically query the DB and populate data.
        if (!is_null($search)) { $this->search($search); }
    }
    protected function onAfterUpdate() { }
}

class Tasks_Events extends Model {
    protected function onAfterUpdate() { /* Task Event Specific */ }
}

class Tasks_Events_Comments extends Tasks_Events {
    protected function onAfterUpdate() { /* Task Event Comment Specific */ }
}
然后,假设一个用例:

class Controller {
    public function updateEvent($task_id, $event_id, $params) {
        $task = new Tasks($task_id);
        $task_event = new Tasks_Events($event_id);

        // Some Analysis of Params
        $task_event->status = $new_status;
        $task_event->save();
    }
}
这是关键。这样做将在AfterUpdate()上调用任务\事件

我的问题是,我可以使用什么样的模型、范式、哲学和方法,这样当我有一组任务事件,并且我对其中一个事件执行操作时,即使我使用基类引用,我也需要调用子类函数

我真的很享受
$e=新任务\u事件(3)的简单性$e->status=4$e->save()我有一个我不喜欢的解决方案,就是做一些类似于
$e=Tasks\u Events::Get($id)任务\事件将在其中查询数据库,确定类型,然后执行“切换”并创建要返回的正确类型

我不喜欢这一点的另一个原因是,我建立了一个模型来做一些很酷的事情,比如
$tasks=newtasks(数组('user\u id'=>5,'status'=>tasks::status\u OPEN))
将构建正确的db查询,并填充用户5打开的所有任务。然后我可以做
foreach($t任务){echo$t->subject;}
等等。所以,我希望能够保持这种系统。。。。但是如果我想利用子类型的继承,我不确定是否可以

恐怕我需要一个工厂模式,但我希望我可能遗漏了一些东西


如果你能想出一个更好的标题,请随意更改。

谢谢@Sam Dufel,你的评论让我思考得更深,我意识到我的设计中存在一个重大缺陷

您对$task->getEvents()提出了一个很好的建议,但我忘记了问题中的一个关键(缺陷?)。这也可能是我陷入麻烦的原因

基本上,我实现迭代器和getter/setter的方式可能是问题的根源。因为它在原始记录数组上迭代

然后,假设我在迭代器中的位置2。调用$item->status,调用u get($name),检查
$this->记录[$this->位置][$name]
!!所以,正如你所看到的,我把自己画进了一个角落。即使使用工厂模式,这也不太管用,因为我在Tasks_Events(嗯……模型)argh中实现迭代器的方式

对不起打扰你们了。谢谢你的想法


更新:我意识到我所做的是将一个“DAO”与一个“模型”结合起来,实际上是一个“模型集合”。我要把它们分开。DAO->find()将返回一个模型集合(可编辑),DAO->findOne()将返回一个模型。三合一很方便,但随着我需求的扩展,它的可扩展性不强。

当你调用一个类的构造函数时,你总是会得到该类的一个实例。没有办法,你需要某种工厂方法。有什么原因不能直接实现
$task->getEvents()