【问题标题】:Creating a globally accessible MySQLi object创建全局可访问的 MySQLi 对象
【发布时间】:2013-05-30 14:22:53
【问题描述】:

我有多个使用静态方法的类。这些函数使用

连接到数据库
$mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASS, DB_NAME);

其中常量 DB_SERVER、DB_USER、DB_PASS、DB_NAME 是定义在全局可访问文件中的数据库变量。最近,我的网站开始变慢,在分析脚本后,我意识到创建对象($mysqli)的调用导致了这个问题。

我的大部分课程都是从 mysqli 扩展而来的,这样

public function __construct($user_id) {
    parent::__construct(DB_SERVER, DB_USER, DB_PASS, DB_NAME);
    $this->retrieve_user_details($user_id);
    $this->check_user_account_type();

}

据我了解,静态方法不要使用 __construct 方法。

有人可以指导我如何创建 $mysqli 对象,以便所有需要它的静态方法都可以访问它。

【问题讨论】:

  • 也将其作为静态类。
  • @Voitcus 这应该有什么内存/进程。我的网站变得非常缓慢
  • 我在想用户 Jari 在他的回答中发布了什么。

标签: php constructor mysqli


【解决方案1】:

这是一种方法:

创建一个可以从任何地方静态访问的单例类。

class DBConnector {
    private static $instance ;
    public function __construct($host, $user, $password, $db){
      if (self::$instance){
        exit("Instance on DBConnection already exists.") ;
      }
    }

    public static function getInstance(){
      if (!self::$instance){
        self::$instance = new DBConnector(a,b,c,d) ;
      }
      return $instance ;
    }
}

一个例子是:

$mysqli = DBConnector::getInstance() ;

但我建议也使用另一种解决方案:

$mysqli = new MySQLi(a,b,c,d) ;

然后你可以将该对象传递给其他类(构造函数)

class Shop {
  private $mysqli ;
  public function __construct(MySQLi $mysqli){
    $this->mysqli = $mysqli ;
  }
}

$show = new Shop($mysqli) ;

【讨论】:

  • 谢谢,我们每天都在学习新东西。您能否详细说明我如何使用它
  • 只阅读静态方法和变量,相信我,一点也不复杂。
  • 不太确定静态方法是否使用构造?
  • 单例包含私有构造函数。在您的单例示例中,不会创建 mysqli 对象,因为没有 new mysqli() 请求。
  • @PhilCross Singletons 也可能包含公共构造函数,它们可能会抛出异常等等。此外,这只是一个示例。
【解决方案2】:

详细说明mysqli单例:

define('SERVER', 'localhost');
define('USERNAME', 'root');
define('PASSWORD', 'password');
define('DATABASE', 'databaseName');

class mysqliSingleton
{
    private static $instance;
    private $connection;

    private function __construct()
    {
        $this->connection = new mysqli(SERVER,USERNAME,PASSWORD,DATABASE);
    }

    public static function init()
    {
        if(is_null(self::$instance))
        {
            self::$instance = new mysqliSingleton();
        }

        return self::$instance;
    }


    public function __call($name, $args)
    {
        if(method_exists($this->connection, $name))
        {
             return call_user_func_array(array($this->connection, $name), $args);
        } else {
             trigger_error('Unknown Method ' . $name . '()', E_USER_WARNING);
             return false;
        }
    }
}

然后你可以通过调用来请求数据库连接:

$db = mysqliSingleton::init();

然后您可以在自己的对象中检索数据库连接:

class yourClass
{
    protected $db;

    public function __construct()
    {
        $this->db = mysqliSingleton::init();
    }
}

【讨论】:

    【解决方案3】:

    这是我能为 Bootstrap 3 想出的最短版本。

       $(document).ready(function() {
            if (hash = window.location.hash) {
                $('.nav-tabs a[href="' + hash + '"]').tab('show');
            }
        });
    

    【讨论】:

      猜你喜欢
      • 2015-08-02
      • 2015-03-22
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-09
      相关资源
      最近更新 更多