oop — использование $ this, когда не в контексте объекта

Когда я пытаюсь выполнить этот код из унаследованного класса, я получил эту ошибку Using $this when not in object context
вот мой код

abstract class Connection {

private static $host;
private static $username;
private static $password;
private static $database;

public function __construct() {
self::$host = 'localhost'; // database server address
self::$username = 'root'; //database server username;
self::$password = ''; //database server password;
self::$database = 'oms'; //database name
}

private function connect() {
return new PDO('mysql:host=' . Connection::$host . ';dbname=' . Connection::$database . '', Connection::$username, Connection::$password);
}

protected function execute($sql) {
$this->connect();
return $this->connect()->query($sql);
}

}

в чем причина? я не использую статический метод в классе соединения. Так почему вы даете эту ошибку?

-2

Решение

Это, вероятно, то, что вы хотите:

abstract class Connection {

protected static $host;
protected static $username;
protected static $password;
protected static $database;
protected static $connection;

public static function load() {
self::$host = 'localhost'; // database server address
self::$username = 'root'; //database server username;
self::$password = ''; //database server password;
self::$database = 'oms'; //database name
}

protected static function connect() {
// Only create the connection once
if (!self::$connection) {
self::$connection = new PDO('mysql:host=' . self::$host . ';dbname=' . self::$database . '', self::$username, self::$password);
}
return self::$connection;
}

public static function execute($sql) {
return self::$connect()->query($sql);
}

}

// Because we can't use an abstract class
class ConcreteConnection extends Connection {}

// Execute a SQL call
ConcreteConnection::execute("SELECT * FROM `table`");

Но тогда у вас будет Синглтон что является болью для тестирования и изменения позже. Я бы порекомендовал вам сделать это так:

abstract class Connection {

protected $host;
protected $username;
protected $password;
protected $database;
protected $connection;

public function _construct($host, $username, $password, $database) {
$this->host = $host;
$this->username = $username;
$this->password = $password;
$this->database = $database;
}

protected function connect() {
if (!$this->connection) {
$this->connection = new PDO('mysql:host=' . $this->host . ';dbname=' . $this->database . '', $this->username, $this->password);
}
return $this->connection;
}

public function execute($sql) {
return $this->connect()->query($sql);
}

}

// Because we can't use an abstract class
class ConcreteConnection extends Connection {}

// Inject our parameters into our class
$connection = new ConcreteConnection('host', 'username', 'password', 'database');
// Execute a SQL call
$connection->execute("SELECT * FROM `table`");
0

Другие решения

Других решений пока нет …