好的,我正在创建一个小型PHP应用程序。当前的结构是这样的:
$client = new AppName'Client;
$model = $client->getModel();
$model->getNode();
这里的一切都很美。客户端负责通过 Socket 将命令连接并运行到我构建的小型 C 应用程序。我只是在这里玩建筑。Client::getModel 返回 Model 的一个实例。在getModel期间,我通过构造函数将客户端注入模型内部。像这样:
public function getModel()
{
return new Model('parameter', $this);
}
反过来...
// Model
public function __construct($param, Client $client)
{
$this->setClient($client);
// ...
}
但是,在 Model::getNode 期间,我想返回 Node 的一个实例。但是,与getModel不同,我不想再次注入客户端。但我必须这样做。现在,我正在这样做:
public function getNode()
{
return new Node('parameter', $this->getClient());
}
我确定这是不正确的。一定是我错过了什么...我理解并使用依赖注入,但我很确定依赖注入容器不会解决我的问题。
我真的不能说出你的整个设计,因为你没有发布大部分内容,但我认为你缺少一个模式。 核心 OO 设计原则之一是,您不会向对象请求数据/对象,然后对该数据/对象进行操作,而是要求对象为您做某事 - 也许该部分只是为了简洁而编辑的,但您可能需要考虑少做"获取"。
为了在我自己的设计中强制这样做,我从不在第一次传递时创建二传手和二传手(好吧,我几乎从不创建二传手)。 稍后,只有在我无法避免它们时才会进入并添加 getter(我认为您仍然经常需要它们......
另一件事是完全避免继承,直到你绝对是解决问题的唯一方法,而不会重复代码或使事情变得混乱。 问题是,这个问题不是用我的母语编码的,所以我真的不知道你在做什么。
看起来你忘记将客户端存储在setClient()中的模型中,或者你没有从getClient()返回它
如果您发布 setClient() 和 getClient() 的代码,我可以验证这一点。
setClient($client){
$this->client = $client;
}
getClient(){
return $this->client;
}
获得客户端不是模型的工作(反之亦然!那是工厂的问题!您的方法应如下所示:
$client = new AppName'Client($model);
切勿将工厂逻辑与业务逻辑混合使用,因为这会使测试变得不可能。