我正在用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对象是必要的,这意味着它应该立即持久化。主题类只能是主题数据的结构。