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