避免全局在函数内部

时间:2015-03-05 22:10:39

标签: php function dependency-injection global-variables

我正在用PHP创建一个论坛系统,在编写插入新主题的代码时,我遇到了令人烦恼的问题。我使用了一堆对象,比如User,Post和Topic,所有这些对象都在构造函数中使用PDO对象(依赖注入)。

注意我知道之前已经提出了类似的问题,但我发现使用依赖注入建议的所有答案,在这种情况下,我发现它不是非常清楚或方便的使用,因为至少有3个,有时更多的依赖注入许多不同的函数。

目前,当我创建一个新主题(线程)时,它会调用一个解析页面进行所有检查:用户必须登录,标题必须至少3个字符长, 等等。为了避免嵌套if,我将所有代码包装在一个函数中,这样我就可以在出现问题时使用return来解决问题。

问题在于我的功能无法访问init页面中创建的用户,帖子和主题对象,这些对象自动在所有页面上都需要。

我知道dependency injection,但将四个不同的对象作为参数传递给我的函数对我来说没有意义。

这是newTopic函数的代码示例,它位于上面提到的解析页面中:

if(!empty($_POST['newTopic']))
    newTopic();

function newTopic()
{
    //Check that the user is connected
    if(!$User->isConnected())
        return false;

    //Other checks ...
    $Topic->new($author, $title, $content);
}

当然,$User$Topic个对象在函数内部无法访问。我可以将其作为参数传递,也可以使用global。我知道不建议使用global,但我不认为将四个不同的对象传递给每个函数是一个更好的做法。

问题在这种情况下,最好的做法是什么?将我的对象作为参数传递给newTopic函数?使用global' s?使用嵌套的if代替函数?

2 个答案:

答案 0 :(得分:0)

可能是建筑商的好地方。

$builder = new TopicBulder()->setAuthor($author)->setTitle($title)->setContent($content)->getTopic();

TopicBuilder是一个类,每个方法返回并引用$ this。

class TopicBuilder {
private $topic;

function __construct() {
    $this->topic = new Topic();
}

public function setAuthor($author) {
    $this->topic->setAuthor($author);
    return $this;
}

....

public function getTopic() {
    return $this->topic.
}

}

或者更清洁的东西;)

答案 1 :(得分:0)

您可以分离新主题创建的逻辑,例如检查,可能是DB操作等,以及创建Topic类的新对象。请注意,创建Topic对象是必要的,这意味着它应该立即执行。主题类可能只是主题数据的结构。