Шаблон PHP Singleton, фатальная ошибка при вызове геттера - PullRequest
0 голосов
/ 04 июля 2018

Я довольно новичок в PHP и пытаюсь изучить ООП так, как я это понимаю. Моя проблема в том, что я понятия не имею, почему я получаю нулевую ошибку ниже, когда я пытаюсь установить соединение mysqli.

Неустранимая ошибка: необученная ошибка: вызов функции-члена getConn () включен пустой

    <?php

class ConnectDB
{
    private $conn;


    private function __construct()
    {
        $this->conn = new mysqli('localhost', 'root', 'root', 'gs');
        $this->checkConnection();
    }

    public function getConn()
    {
        return $this->conn;
    }

    /**
     * @return ConnectDB
     */
    public static function getInstance()
    {
        static $instance = null;
        if($instance == null)
        {
            $instance == new ConnectDB();
        }
        return $instance;
    }

    public function checkConnection()
    {
        if($this->conn->connect_errno)
        {
            echo "Can't connect to Database: " .mysqli_connect_error();
            exit();
        }
        else
        {
            echo "Connected!";
        }

    }

}

$conn = ConnectDB::getInstance()->getConn();

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Посмотрите, можете ли вы сделать эту работу:

<?php

class ConnectDB {
    private $_connection;
    private static $_instance; //The single instance
    private $_host = "localhost";
    private $_username = "root";
    private $_password = "root";
    private $_database = "gs";

    // 
    public static function getInstance() {
        if(!self::$_instance) { // If no instance then make one
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    // Constructor
    private function __construct() {
        $this->_connection = new mysqli($this->_host, $this->_username, $this->_password, $this->_database);

        // Error handling
        if(mysqli_connect_error()) {
            trigger_error(
                "Failed to conencto to MySQL: " . mysql_connect_error(),E_USER_ERROR
            );
        } else{
            echo "Connected!";
        }
    }


    private function __clone() { }


    public function getConn() {
        return $this->_connection;
    }

    $db = ConnectDB::getInstance();
    $mysqli = $db->getConn(); 

}
?>
0 голосов
/ 04 июля 2018

В вашем методе getInstance, где вы создаете экземпляр класса, который вы написали $instance == new ConnectDB();. Используйте один = для назначений.

Я не думаю, что ваш getInstance метод - это всего лишь одиночка. Вы инициализируете переменную $instance при каждом вызове null, поэтому вы должны каждый раз получать новый экземпляр.

Попробуйте это так:

class ConnectDB
{
    private $conn;
    private static $instance = null;
    ...
    public static function getInstance()
    {
        if(self::$instance == null)
        {
            self::$instance == new ConnectDB();
        }
        return self::$instance;
    }
    ...
...