避免全局';s在函数内部


Avoid global's inside of a function

我正在用PHP制作一个论坛系统,在编写插入新主题的代码时遇到了一个烦人的问题。我使用了一堆对象,比如User、Post和Topic,它们都在构造函数中接受一个PDO对象(依赖注入)。

注意我知道以前也问过类似的问题,但我找到的所有答案都建议使用依赖项注入,在这种情况下,我觉得使用起来不太清楚或方便,因为至少有3个,有时甚至更多的依赖项要注入到许多不同的函数中。

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

问题是,我的函数无法访问在init页面中创建的User、Post和Topic对象,这些对象在所有页面上都是自动要求的。

我知道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的?使用嵌套的if而不是函数?

对于构建器来说可能是个好地方。

$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.
}

}

或者更干净的东西;)

您可以将创建新主题的逻辑(如检查、DB操作等)与创建topic类的新对象分开。注意,创建Topic对象是必要的,这意味着它应该立即持久化。主题类只能是主题数据的结构。