Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-启动数据库类的最佳位置在哪里?_Php_Oop - Fatal编程技术网

PHP-启动数据库类的最佳位置在哪里?

PHP-启动数据库类的最佳位置在哪里?,php,oop,Php,Oop,最近,我从Page类的_构造中取出了Db启动代码,并将其放在启动Page类之后。我从Page类中删除了它,因为我希望能够从任何地方(例如其他类)访问它。它在启动时还需要服务器、用户名、密码和数据库参数,我不希望每次都输入这些参数 现在有没有办法从Page类下访问它?我尝试过几种方法,甚至是全局的(有人告诉我这是一种糟糕的做事方式),但到目前为止都无济于事。我对OO还是新手,但我正在尽可能地自学 我应该让它成为一个静态类吗?这会影响我设置的Db的延迟连接器吗 任何帮助都将不胜感激 多谢各位 [编辑

最近,我从Page类的_构造中取出了Db启动代码,并将其放在启动Page类之后。我从Page类中删除了它,因为我希望能够从任何地方(例如其他类)访问它。它在启动时还需要服务器、用户名、密码和数据库参数,我不希望每次都输入这些参数

现在有没有办法从Page类下访问它?我尝试过几种方法,甚至是全局的(有人告诉我这是一种糟糕的做事方式),但到目前为止都无济于事。我对OO还是新手,但我正在尽可能地自学

我应该让它成为一个静态类吗?这会影响我设置的Db的延迟连接器吗

任何帮助都将不胜感激

多谢各位

[编辑]


类似的问题:

全局变量确实有用,这就是其中之一。除非您可能需要多个数据库连接(甚至仍然需要),否则我认为设置全局$db对象没有问题

另一种方法是使用一个静态的“工厂”类来获取对象。在Joomla 1.5中,访问DB对象的方式如下:

$db =& JFactory::getDBO();
getDBO函数检查DB对象是否已创建:如果已创建,则返回对它的引用,否则连接并初始化,然后返回它

这同样适用于其他“可以设置为全局”对象,如当前用户对象。

某种全局(可以是全局变量、单例或其他变量)是对您以前方法的改进,因此您走上了正确的道路。但是,一般来说,您应该尽量减少程序状态的范围(出于一些原因,我在这里不作详细介绍)。使用全局变量与此原则相冲突。对于这个问题有不同的解决方案,但最有效且经常被忽视的方法是使用控制反转;您的类应该接收依赖项,而不是获取依赖项。例如,假设您当前拥有此

class EditUserController {
  function saveUser() {
    $db = Database::GetInstance();
    $db->execute("update users set ...", ...);
  }
}
您可以将其更改为:

class EditUserController {
  function saveUser($db) {
    $db->execute("update users set ...", ...);
  }
}
不过,在函数参数级别传递依赖项可能有点笨拙,因此折衷办法是在每个对象级别传递依赖项:

class EditUserController {
  protected $db;
  function __construct($db) {
    $this->db = $db;
  }
  function saveUser() {
    $this->db->execute("update users set ...", ...);
  }
}

这是OO编程中相当常见的模式。除了比传递函数参数更实用之外,它还具有将构造(共享依赖项相互连接)与运行时(使用它们)分离的额外好处。这使得很多事情变得简单。

创建singleton方法是为了确保任何类只有一个实例。但是,由于人们将其作为一种快捷方式全球化,因此它被称为懒惰和/或糟糕的编程。

我将尝试开发类似的东西。我已经见过=&几次了,但我仍然不确定它的含义。它将变量设置为引用。更多信息:我更喜欢在=和&之间的空格,这不会使它看起来像一个新的操作符在=之后出现会使它看起来更混乱(因为它的顺序与+=、-=、*=或/=)不一样是的-我已经和其他程序员就此进行了“讨论”。显然,使用“=&”更正确,但我个人更喜欢“=&”,除非您使用的是php≤ 4、参照分配对象没有意义。我问了一个类似的问题,我在你的类名中看到一个动词(