Php 我可以将PDO连接保存到$GLOBALS并在以后使用它来确保连接只创建一次吗?
我只想确保创建一次PDO连接,以便对脚本进行一些优化 下面的代码可以变得更加漂亮和易于维护,但在这里我只想让它尽可能简单。(即使用类和构造函数) 此代码是否确保创建一次PDO连接?换句话说,被调用的方法应该能够检索已经在index.php中创建的连接并使用它 是否可以更优化(提高性能) 更新: 我不是说持续的连接。 index.php file.phpPhp 我可以将PDO连接保存到$GLOBALS并在以后使用它来确保连接只创建一次吗?,php,pdo,Php,Pdo,我只想确保创建一次PDO连接,以便对脚本进行一些优化 下面的代码可以变得更加漂亮和易于维护,但在这里我只想让它尽可能简单。(即使用类和构造函数) 此代码是否确保创建一次PDO连接?换句话说,被调用的方法应该能够检索已经在index.php中创建的连接并使用它 是否可以更优化(提高性能) 更新: 我不是说持续的连接。 index.php file.php 代码的替代方法是使用单例模式 在软件工程中,singleton模式是一种软件设计模式,它将类的实例化限制为一个“单个”实例。当需要一个对象来协调
代码的替代方法是使用单例模式 在软件工程中,singleton模式是一种软件设计模式,它将类的实例化限制为一个“单个”实例。当需要一个对象来协调整个系统中的操作时,这非常有用 例如:
class Connection {
private static $instance;
public static function make($config){
try {
if(self::$instance === NULL) {
self::$instance =
new \PDO ("mysql:host=" . $config['host'] . ";
dbname=" . $config['name'],$config['username'],$config['password'],$config['options']
);
}
return self::$instance;
} catch (\PDOException $e) {
die("Database connection error: " . $e->getMessage());
}
}
}
// use
$dbConnection = Connection::make($config['database']);
是的,从技术上讲,你可以,但一般不赞成使用全局变量。请注意,当前解决方案的“简单性”是以未来的可维护性和可维护性为代价的flexibility@YourCommonSense谢谢我可以如何简单地改进它?创建一个数据库接口类,其中连接作为静态类成员(如果您确定您永远不需要超过1个连接)-将该对象传递到
用户
类构造函数中(尽管那里可能还有另一层抽象;一个用户->数据库
接口类)。只要你的OOP是一个货物崇拜(无意冒犯,但是带有静态方法的类不是真正的OOP,而是名称空间函数),任何方法都可以,即使是全局方法。如果你希望你的OOP是正确的,那么让你的方法成为非静态的,@YourCommonSense我的OOP没有那么糟糕;)我只是为了让这个问题更容易理解而使用了这么愚蠢的代码。哇!就这样。因此,如果我选择退出(跳过)代码可维护性并选择正确的设计模式(我真的应该避免这种情况),那么您的代码和我的代码的行为是否相同?@sam Singleton是一个反模式,与全局模式一样不受欢迎。所以,不要那么激动不要提及PDO的特定部分是坏消息的明显表现practices@YourCommonSense人们大多不赞成单例测试,因为它使测试更加困难,因为它更难复制。这对于数据库连接来说应该不是什么大问题。@SamtheExhousted此代码的行为应该与您的代码类似
class user{
public static function create_user(){
$conn = $GLOBALS['db_connection']; // should not attempt to reconnect because a PDO connection is already made in index.php
$stmt = $conn->prepare("INSERT INTO table1 ...");
// ...
functions::do_sth(); // again should not attempt to reconnect because a PDO connection is already made in index.php
// ...
exit();
}
}
class functions{
public static function do_sth(){
$conn = $GLOBALS['db_connection']; // should not attempt to reconnect because a PDO connection is already made in index.php
// ...
}
}
class Connection {
private static $instance;
public static function make($config){
try {
if(self::$instance === NULL) {
self::$instance =
new \PDO ("mysql:host=" . $config['host'] . ";
dbname=" . $config['name'],$config['username'],$config['password'],$config['options']
);
}
return self::$instance;
} catch (\PDOException $e) {
die("Database connection error: " . $e->getMessage());
}
}
}
// use
$dbConnection = Connection::make($config['database']);