3

好的,我正在创建一个小型 PHP 应用程序。目前的结构是这样的:

$client = new AppName\Client;
$model = $client->getModel();
$model->getNode();

这里的一切都很美好。Client 负责通过 Socket 连接和运行命令到我构建的一个小型 C 应用程序。我只是在这里玩建筑。Client::getModel 返回一个模型实例。在 getModel 期间,我通过构造函数将 Client 注入到 Model 中。像这样的东西:

public function getModel()
{
    return new Model('parameter', $this);
}

反过来...

// Model
public function __construct($param, Client $client)
{
    $this->setClient($client);
    // ...
}

但是,在 Model::getNode 期间,我想返回一个 Node 实例。但是,与 getModel 不同,我不想再次注入 Client。但我不得不。现在,我正在这样做:

public function getNode()
{
    return new Node('parameter', $this->getClient());
}

我确定这是不正确的。一定有我遗漏的东西......我理解并使用依赖注入,但我很确定依赖注入容器不会解决我的问题。

4

3 回答 3

0

看起来您忘记将客户端存储在 setClient() 内的模型中,或者您没有从 getClient() 返回它

如果您发布 setClient() 和 getClient() 的代码,我可以验证这一点。

setClient($client){
    $this->client = $client;
}

getClient(){
    return $this->client;
}
于 2012-05-12T04:02:50.270 回答
0

我无法真正谈论您的整个设计,因为您没有发布大部分内容,但我认为您缺少一个模式。核心 OO 设计原则之一是您不向对象询问数据/对象然后对该数据/对象进行操作,而是要求对象为您做某事-也许只是为了简洁而编辑了该部分,但是您可能要考虑减少“获取”。

为了在我自己的设计中强制执行此操作,我从不在第一遍创建 setter 和 getter(嗯,我几乎从不创建 setter)。稍后我会在我无法避免的时候加入并添加吸气剂(我认为你仍然经常需要它们......)

另一件事是完全避免继承,直到您绝对是解决问题的唯一方法,而不会重复代码或使事情变得混乱。问题是,这个问题没有用我的母语编码,所以我真的不知道你在做什么。

于 2012-05-12T04:30:11.667 回答
0

获取客户不是模型的工作(反之亦然!)。那是工厂的问题!您的方法应如下所示:

$client = new AppName\Client($model);

永远不要将工厂逻辑与业务逻辑混为一谈,因为这会使测试变得不可能。

于 2012-05-12T19:18:40.080 回答