Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 一个类只有一个实例_Php_Oop - Fatal编程技术网

Php 一个类只有一个实例

Php 一个类只有一个实例,php,oop,Php,Oop,我想知道如何获得以下db连接的一个实例 例如,假设这是文件Database.php中的我的类 public class Database { public function __construct() { try { // PDO Here print("Connected!"); } catch (PDOException $e) { die($e->getMessage());

我想知道如何获得以下db连接的一个实例

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

public class Database {
    public function __construct() {
      try {
            // PDO Here
            print("Connected!");
        } catch (PDOException $e) {
            die($e->getMessage());
        }
    }
}
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;
    }
}
index.php

Database();
Database();
 Database::getInstance();
 Database::getInstance();
结果

已连接!连接


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

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

有很多方法可以做到这一点,但我会这样做

Database.php

public class Database {
    public function __construct() {
      try {
            // PDO Here
            print("Connected!");
        } catch (PDOException $e) {
            die($e->getMessage());
        }
    }
}
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;
    }
}
index.php

Database();
Database();
 Database::getInstance();
 Database::getInstance();
将只打印一次“Connected!”,因为实例变量已实例化

如果你没听说过,我建议你读一读。看看他们展示的示例代码,虽然不是用PHP编写的,但应该很容易理解

编辑:

如果您想缩短
getInstance
函数,可以执行以下操作

return !isset(self::$instance) ? self::$instance = new self : self::$instance;

阅读关于单例模式。阅读关于单例模式。该死,你们两个都赢了!但是,是的,单身模式完全描述了你们的问题。谢谢你们从来没听说过,但现在我知道了。