Php 避免全球';函数的内部

Php 避免全球';函数的内部,php,function,dependency-injection,global-variables,Php,Function,Dependency Injection,Global Variables,我正在用PHP制作一个论坛系统,在编写插入新主题的代码时遇到了一个令人讨厌的问题。我使用了一组对象,比如User、Post和Topic,所有这些对象都在其构造函数(依赖项注入)中使用了一个PDO对象 注意我知道以前也有人问过类似的问题,但我找到的所有答案都建议使用依赖项注入,在这种情况下,我觉得它不太清楚,也不方便使用,因为将至少有3个(有时更多)依赖项注入到许多不同的函数中 目前,当我创建一个新主题(线程)时,它会调用一个解析页面来执行所有检查:用户必须登录,标题必须至少有3个字符长,等等。为

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

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

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

问题是我的函数无法访问在
init
页面中创建的用户、帖子和主题对象,所有页面都需要这些对象

我知道
依赖注入
,但将四个不同的对象作为参数传递给函数对我来说没有意义

下面是
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
函数?使用
全局
?如果使用嵌套的
,而不是函数,则使用嵌套的

可能是构建器的一个好位置

$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数据的结构。

我投票支持依赖项注入。另外,您的编码方式是混合函数和类,为什么不使用一个具有create方法的Topic类呢?(这仍然会使用依赖注入,但至少会使其面向对象且一致)@user3238482此时,我正在使用带有
newTopic
函数的解析页面来验证用户输入、显示错误消息以及所有内容,`Topic`类主要负责访问数据库。如果我在'Topic'类内部进行验证,也会出现同样的问题,因为它也没有访问'User'类的权限(例如,检查用户是否登录)。如果确实不希望函数直接访问对象,则可以传递值,例如$logged_in=$User->isConnected();然后:函数中的newTopic(!$logged\u in)只需检查(!$logged\u in)等。。。