Mam sobie taką klasę bazową (zostawiam najważniejsze elementy)
<?php /** * @author Tomasz Suchanek * @copyright Tomasz Suchanek * @final */ require_once('config.inc.php'); require_once('$RBX_CORE/includes/errors.inc.php'); require_once('$RBX_CORE/includes/constant.inc.php'); /** * Klasa bazowa dla wszystkich klas * */ abstract class BaseClass { /** * Połaczenie z bazą danych * * @var array Przechowuje identyfiaktor połączenia z bazą danych. * @access private */ private $db; /** * Wynik zapytania * * @var array Wynik zapytania skierowanego do bazy * @access private */ private $result; /** * Zapytanie do bazy * * @var string Zapytanie kierowane do bazy * @access private */ private $sql; /** * Konstruktor * @access public */ public function __construct(){ # połącz z bazą typu MySQL $this->db = new PDO('mysql:host='.$RBX_DB['host'].';dbname='.$RBX_DB['name'], $RBX_DB['user'], $RBX_DB['pass']); #polskie litery $this->setSql('SET NAMES latin2; SET collation_connection = latin2_general_ci;'); $this->doSQL(); # raportuj wszystkie błędy z PDO $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); # raportuj wszysrkie błedy z php } /** * Ustawia wartości domyślne dla pól prywatnych klasy * * @abstract * */ abstract public function setDefault(); /** * Zwróc obiekt połączenia z bazą * * @return array Tablica z identyfiaktorem połączenia z bazą danych * @access public */ public function getDB(){ return $this->db; } /** * Zwraca rezultat zapytania * * @return array Tablica zawierająca rezultat zapytania * @access public */ public function getResult(){ return $this->result; } /** * Ustaw zapytanie sql * * @param string $sql Zapytanie SQL * @access public */ public function setSql($sql) { $this->sql = $sql; } /** * Zwróć treść zapytania * * @return string $sql Zapytanie SQL */ public function getSql() { return $this->sql; } /** * Zwróć wyjątek jeśli rezultat zapytania jest pusty * * @return true jeśli wynik zapytania jest poprawny * @access public */ public function checkResult() { if ($this->result) { return true; } else { return false; } } /** * Wywołanie wszytkich metod związanych z wykonaniem zapytanie w jednej funkcji * treść zapytania zostaje zapamiętana * * @param string $sql Zapytanie SQL * @access public * @return boolean */ public function doSQL($sql=''){ # gdy niepusty to zapisz zapytanie SQL #wykonaj zapytanie i zapisz do wyników $stmt = $this->db->prepare($this->getSql()); $stmt->execute(); $this->result = $stmt->fetchAll(PDO::FETCH_ASSOC); $this->result = $this->result[0]; } $stmt->closeCursor(); return $this->checkResult(); } } ?>
i chciałem skorzystać z wzorca Singleton (osatnio czytałem i postanowiłem przerobić to tak, żeby działało)
Więc zrobiłem tak:
$db jest statyczne
<?php ?>
getDB zmieniłem żeby działało jak getIsntance
<?php public function getDB(){ if (self::$db == false) { self::$db = new PDO('mysql:host='.$RBX_DB['host'].';dbname='.$RBX_DB['name'], $RBX_DB['user'], $RBX_DB['pass']); #polskie litery $this->doSQL("SET NAMES latin2; SET collation_connection = latin2_general_ci;"); # raportuj wszystkie błędy z PDO $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } return self::$db; } ?>
a kontruktor teraz wygląda tak
<?php public function __construct(){ $this->getDB(); # raportuj wszysrkie błedy z php } ?>
Pozostałość bez zmian.
Mam inne klasy, które dziedziczą po BaseClass i które wywołują w swoim kontruktorze kontruktor rodzica oraz korzystają z $this->doSQL(); Niestety wywołuje too błąd:
Kod
atal error: Cannot access empty property in C:\wamp\www\robotECS\core\classes\baseclass.php on line 141
(to ta linia 143 z pierwszego listingu)Dlaczego właściwość jest pusta? Pewnie coś robię źle, jeśli tak to co? Czy wywołanie $this->db->jakaśFunkcja() w funkcjach dziedziczacych po baseClass jest porpawne jeśli nie to jak to robić?