Php 在其他对象上工作的对象

Php 在其他对象上工作的对象,php,oop,design-patterns,Php,Oop,Design Patterns,所以我正在做一个项目,目标是从用户的数据库中收集数据,进行搜索。我将从搜索中收集的不同类型的信息建模为对象。我计划创建一种管理对象,它将创建和操作这些对象 我的问题是,在创建这个“管理”对象时,我应该考虑什么样的模式或设计决定?我想到的一件事是,这个对象将与“搜索数据”对象紧密耦合,因为它可能会在其方法中创建并保存它们 我认为依赖注入在这种情况下不起作用,因为同一对象的多个副本可能需要处理,所以不可能知道参数列表是什么 谢谢你的见解。我建议你看看这里的创作模式列表 抽象工厂、建设者、工厂方法都可

所以我正在做一个项目,目标是从用户的数据库中收集数据,进行搜索。我将从搜索中收集的不同类型的信息建模为对象。我计划创建一种管理对象,它将创建和操作这些对象

我的问题是,在创建这个“管理”对象时,我应该考虑什么样的模式或设计决定?我想到的一件事是,这个对象将与“搜索数据”对象紧密耦合,因为它可能会在其方法中创建并保存它们

我认为依赖注入在这种情况下不起作用,因为同一对象的多个副本可能需要处理,所以不可能知道参数列表是什么


谢谢你的见解。

我建议你看看这里的创作模式列表


抽象工厂、建设者、工厂方法都可能适用于您正在寻找的内容。依赖注入并不是一个适合您所要求的概念。DI使在运行时连接起来和删除依赖项的硬编码变得更容易。其实并不完全一样。

我认为最好创建一个父类或模式,以便所有其他对象或子对象都遵循或继承。例如,假设您希望获取或设置特定对象中的某些数据。如果数据字段名称不同,则会遇到问题

假设您有一个名为
GoogleSearch
的对象和一个名为
YahooSearch
的对象。如果用户在
GoogleSearch
中输入的查询可以通过
$google->getQuery()
方法检索,而YahooSearch查询必须使用
$yahoo->getInput()
检索,那么很明显,除非您希望在出现此类信息时手动指定,否则您将遇到问题

然而,如果您在开发框架之前考虑类似的事情,那么自动化一切就变得容易多了。在这种情况下,可以肯定地说,如果您正在从用户搜索中构建数据集合,那么所有搜索都将共享一些属性

比如说,, -他们使用了什么搜索引擎? -输入的查询是什么? -搜索是什么时候进行的? -来自哪个ip? -用户是否选择了其中一个结果? -用户是否在计算机、移动设备或其他设备上搜索

考虑到这些最小的因素,我们可以设计一个系统来合并所有这些属性。例如,这可能是您的父类:

class Search {
    protected $engine, $query, $when, $who, $browserType;
    function __construct() {
        $this->when = time();
        $this->browserType = $_SERVER['HTTP_USER_AGENT'];
        $this->who = $_SERVER['REMOTE_ADDR'];
    // some more class methods
    }
}
然后,您可以继承此类以创建如下特定搜索类型:

class GoogleSearch extends Search {
    function __construct() {
        // set the engine to Google
        $this->engine = 'Google';
    }
}

<> P>一些要考虑的因素可能是变量的范围或可见性。在这里,我将它们声明为受保护的,这基本上意味着它们是私有的,但可以被子类或扩展类访问。希望这有帮助,如果您有任何其他问题或我不理解您的问题,请告诉我,我会尽力帮助您。

我对面向对象编程的一般想法是,如果不需要,就不要使用对象。你应该有问题并思考解决方案,而不是改变你的问题,使之适合特定的解决方法。起初我想说你不完全理解我想做什么,但后来它成功了。我想用过程编程的方式来管理对象。例如,我将有一个类似gatherSearchData()的方法,它将获取数据,然后创建、操作和保存搜索对象。相反,我需要像你建议的那样对实际搜索本身进行建模。我没有用面向对象的思维方式思考。