一个类只有一个实例

Tin*_*ino 2 php oop

我想知道如何获得以下数据库连接的一个实例。

例如,假设这是我在文件 Database.php 中的类

public class Database {
    public function __construct() {
      try {
            // PDO Here
            print("Connected!");
        } catch (PDOException $e) {
            die($e->getMessage());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

索引.php

Database();
Database();
Run Code Online (Sandbox Code Playgroud)

结果

Connected!Connected!

即使我调用它两次,我也只想实例化该类一次。

And*_*raz 6

您可以使用静态变量将 Database 类分配给,然后使用 if 语句检查该变量是否已实例化。

有很多方法可以做到这一点,但这就是我要做的。

数据库.php

public class Database
{
    private static $instance;

    private function __construct()
    {
        try {
           // PDO Here
           print("Connected!");
        } catch (PDOException $e) {
           die($e->getMessage());
        }
    }

    public static function getInstance()
    {
        // Check is $_instance has been set
        if(!isset(self::$instance)) 
        {
            // Creates sets object to instance
            self::$instance = new Database();
        }

        // Returns the instance
        return self::$instance;
    }
}
Run Code Online (Sandbox Code Playgroud)

索引.php

 Database::getInstance();
 Database::getInstance();
Run Code Online (Sandbox Code Playgroud)

只会打印“已连接!” 一次是因为实例变量已被实例化。

如果您还没有听说过单例模式,我建议您阅读它。看看他们展示的示例代码,它不是用 PHP 写的,但应该很容易理解。

编辑:

如果您想getInstance缩短功能,您可以执行以下操作。

return !isset(self::$instance) ? self::$instance = new self : self::$instance;
Run Code Online (Sandbox Code Playgroud)