Singleton pattern causes error: Using $ this when not in object context

2

I made this Singleton pattern that I saw on a site and found it great, well what I wanted. However something is going wrong because I have the error:

Fatal error: Uncaught Error: Using $this when not in object context in /opt/lampp/htdocs/myschool/DAO/Conncetion.php:37
Stack trace: #0 /opt/lampp/htdocs/myschool/Login.php(18):DAO\Connection::getInstance() #1 /opt/lampp/htdocs/myschool/login.php(5):Login->loginconnect() #2 {main} thrown in /opt/lampp/htdocs/myschool
/DAO/Conncetion.php on line 37

And if I put function __construct () {} as private or protected then yes for that reason. I've read about using $ this in a context where it is not an object. However I want to use this command because of the idea of loading the variables dynamically by the functions.

This is the class:

class Connection
{
    public static $instance;
    private static $dbtype   = "mysql";
    private static $host     = "localhost";
    private static $port     = "3306";
    private static $user     = "root";
    private static $password = "";
    private static $db       = "school";

    /*Metodos que trazem o conteudo da variavel desejada
     @return   $xxx = conteudo da variavel solicitada*/
    private static function getDBType()  {return self::$dbtype;}
    private static function getHost()    {return self::$host;}
    private static function getPort()    {return self::$port;}
    private static function getUser()    {return self::$user;}
    private static function getPassword(){return self::$password;}
    private static function getDB()      {return self::$db;}

     function __construct() {

    }

    public static function getInstance()
    {

     if(!isset(self::$instance)){
         self::$instance = new PDO($this->getDBType().":host=".$this->getHost().";port=".$this->getPort().";dbname=".$this->getDB(), $this->getUser(), $this->getPassword());
            self::$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            self::$instance->setAttribute(PDO::ATTR_ORACLE_NULLS, PDO::NULL_EMPTY_STRING);

        }

        return self::$instance;
    }

    private function __clone()
    {
    }
    private function __wakeup()
    {
    }
}
    
asked by anonymous 04.10.2017 / 21:12

1 answer

5

getInstance() is static So you do not have any references (or can not access) the attributes of an object then you can not use $this . You need to change $this to self either via properties or method (see example)

Change:

self::$instance = new PDO($this->getDBType().":host=".$this->getHost().";port=".$this->getPort().";dbname=".$this->getDB(), $this->getUser(), $this->getPassword());

by:

self::$instance = new PDO(self::getDBType().":host=".self::getHost().";port=".self::getPort().";dbname=".self::getDB(), self::getUser(), self::getPassword());

Using this design pattern for a connection class is not interesting because if the application needs to connect to more than one database it will not be possible (even with different server, user base and password data) because a instantiated connection. In some cases some opt for the pattern doubleton , which is basically a ctrl + C , ctrl V of the original class with the modified connection data.

Relates to:

When to use self vs $ this in PHP?

Singleton or Class and Static Members

Singleton Pattern for Database Communication

Why should not we use Singleton?

Should I avoid permanent connections and Singleton class in a PHP project

    
04.10.2017 / 21:19