Php 我可以将PDO连接保存到$GLOBALS并在以后使用它来确保连接只创建一次吗?

Php 我可以将PDO连接保存到$GLOBALS并在以后使用它来确保连接只创建一次吗?,php,pdo,Php,Pdo,我只想确保创建一次PDO连接,以便对脚本进行一些优化 下面的代码可以变得更加漂亮和易于维护,但在这里我只想让它尽可能简单。(即使用类和构造函数) 此代码是否确保创建一次PDO连接?换句话说,被调用的方法应该能够检索已经在index.php中创建的连接并使用它 是否可以更优化(提高性能) 更新: 我不是说持续的连接。 index.php file.php 代码的替代方法是使用单例模式 在软件工程中,singleton模式是一种软件设计模式,它将类的实例化限制为一个“单个”实例。当需要一个对象来协调

我只想确保创建一次PDO连接,以便对脚本进行一些优化

下面的代码可以变得更加漂亮和易于维护,但在这里我只想让它尽可能简单。(即使用类和构造函数)

此代码是否确保创建一次PDO连接?换句话说,被调用的方法应该能够检索已经在index.php中创建的连接并使用它

是否可以更优化(提高性能)

更新: 我不是说持续的连接。

index.php

file.php


代码的替代方法是使用单例模式

在软件工程中,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']);