Php 数据库连接是全局还是单例?
在PHP中使用单例而不是全局数据库连接有什么好处?我觉得使用单例而不是全局使代码变得不必要的复杂 全局代码 单例编码Php 数据库连接是全局还是单例?,php,design-patterns,singleton,Php,Design Patterns,Singleton,在PHP中使用单例而不是全局数据库连接有什么好处?我觉得使用单例而不是全局使代码变得不必要的复杂 全局代码 单例编码 如果有比全局或单例更好的初始化数据库连接的方法,请提及它,并描述它相对于全局或单例的优势。它非常简单。永远不要使用全局连接或单一连接。如果你不打算使用持久连接,并且有不这样做的情况,我发现在OO设计中,单一连接在概念上比全局连接更容易接受 在真正的OO体系结构中,单例连接比每次创建对象的新实例更有效。我不确定能否回答您的具体问题,但我想建议,如果这适用于基于web的系统,则全局/
如果有比全局或单例更好的初始化数据库连接的方法,请提及它,并描述它相对于全局或单例的优势。它非常简单。永远不要使用全局连接或单一连接。如果你不打算使用持久连接,并且有不这样做的情况,我发现在OO设计中,单一连接在概念上比全局连接更容易接受
在真正的OO体系结构中,单例连接比每次创建对象的新实例更有效。我不确定能否回答您的具体问题,但我想建议,如果这适用于基于web的系统,则全局/单例连接对象可能不是最佳方案。DBMS通常被设计为以有效的方式管理大量的唯一连接。如果您使用的是全局连接对象,那么您需要做几件事:
感谢Crad对此的评论。对于给定的示例,我认为没有理由使用单例。根据经验,如果我唯一关心的是允许一个对象的单个实例,那么如果语言允许,我更喜欢使用globals。一般来说,我会使用单实例进行数据库连接。。。您不希望每次需要与数据库交互时都创建新连接。。。这可能会影响网络的性能和带宽。。。为什么要创建一个新的,当有一个可用的。。。只要我的2美分
RWendi这两种模式实现了相同的净效果,为数据库调用提供了一个单一的访问点 就具体实现而言,singleton有一个小优势,即在至少一个其他方法请求之前不会启动数据库连接。实际上,在我编写的大多数应用程序中,这并没有多大区别,但如果您有一些根本不进行任何数据库调用的页面/执行路径,这将是一个潜在的优势,因为这些页面永远不会请求到数据库的连接
另一个细微的区别是,全局实现可能会无意中践踏应用程序中的其他变量名。您不太可能会意外地声明另一个全局$db引用,尽管您可能会在打算写入if($db==null)时意外地覆盖它(例如,您写入if($db=null)。singleton对象阻止了这一点。我知道这很旧,但Dr8k的答案几乎就在那里 当你考虑写一段代码时,假设它会发生变化。这并不意味着你假设它在将来某个时候会发生什么样的变化,而是会发生某种形式的变化 将其作为一个目标来减轻未来进行更改的痛苦:全局设置是危险的,因为它很难在单个位置进行管理。如果我想在将来使该数据库连接上下文感知,该怎么办?如果我想让它每使用5次就自动关闭并重新打开一次该怎么办?如果为了扩展我想要的应用程序,我决定这样做该怎么办使用10个连接的池?或可配置的连接数 单例工厂为您提供了这种灵活性。我只需很少的额外复杂性就可以设置它,并且获得的不仅仅是对同一连接的访问;我还可以在以后以简单的方式更改该连接传递给我的方式 请注意,我说的是单例工厂,而不是简单的单例工厂。单例工厂和全局工厂之间的差别很小,是的。正因为如此,没有理由建立单例连接:既然可以创建一个常规的全局工厂,为什么还要花时间来建立它 工厂给你的是一个为什么要获得连接,以及一个单独的点来决定你要获得什么连接(或连接) 例子 然后,在6个月后,当你的应用程序变得非常有名,并且变得笨拙不堪,你决定需要不止一个连接时,你所要做的就是在getConnection()方法中实现一些池
$conn = new PDO(...);
function getSomething()
{
global $conn;
.
.
.
}
class DB_Instance
{
private static $db;
public static function getDBO()
{
if (!self::$db)
self::$db = new PDO(...);
return self::$db;
}
}
function getSomething()
{
$conn = DB_Instance::getDBO();
.
.
.
}
class ConnectionFactory
{
private static $factory;
private $db;
public static function getFactory()
{
if (!self::$factory)
self::$factory = new ConnectionFactory(...);
return self::$factory;
}
public function getConnection() {
if (!$this->db)
$this->db = new PDO(...);
return $this->db;
}
}
function getSomething()
{
$conn = ConnectionFactory::getFactory()->getConnection();
.
.
.
}
<?php // file0.php
final class Main_Class
{
private static $instance;
private $time;
private final function __construct()
{
$this->time = 0;
}
public final static function getInstance() : self
{
if (self::$instance instanceof self) {
return self::$instance;
}
return self::$instance = new self();
}
public final function __clone()
{
throw new LogicException("Cloning timer is prohibited");
}
public final function __sleep()
{
throw new LogicException("Serializing timer is prohibited");
}
public final function __wakeup()
{
throw new LogicException("UnSerializing timer is prohibited");
}
}
<?php // file1.php
global $YUZO;
$YUZO = new YUZO; // YUZO is name class
<?php // file2.php
global $YUZO;
$YUZO->method1()->run();
$YUZO->method2( 'parameter' )->html()->print();