我正在用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
代替函数?
答案 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对象是必要的,这意味着它应该立即执行。主题类可能只是主题数据的结构。