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