Hallo,
soweit ich weiß ist es bei OOP möglich jede Eigenschaft/Methode der Basisklasse in einer abgeleiteten Unterklasse zu überschreiben. Einzige Voraussetzung ist, daß die Sichtbarkeit dadurch nicht eingeschränkt wird.
Z.B.:
Analog zu den Methoden verhält es sich auch mit den Eigenschaften.
Nun möchte ich von einer MySQL-Klasse eine Singleton-Klasse wie folgt ableiten:
Soweit so gut. Jetzt gibt es nur noch ein Problem. Wenn ich die Basisklasse auch ohne die Unterklasse nutzen möchte, dann brauche ich doch einen „public“ Kontruktor. Wenn ich jedoch den Konstruktor in der Basisklasse (MySql) auf public setze, dann muss ich zwangsläufig auch den Konstruktor in der Unterklasse (MySqlSingleton) auf public ändern (ansonsten gibt es einen Access level error) und dann ist mein Singleton-Pattern strenggenommen kein Singleton mehr.
Nun bin ich im Zusammenhang mit dem genannten Problem auf den folgenden Code gestoßen:
Hier scheint es komischerweise zu funktionieren. Der Konstruktor in der abgeleiteten Singelton-Klasse ist mit protected geschützt und der Konstruktor in der Basisklasse MySQLi ist offensichtlich public?! Nun verstehe ich ehrlich gesagt nicht, wie das möglich ist?
Vielen Dank im Voraus für jede Hilfe.
jack
soweit ich weiß ist es bei OOP möglich jede Eigenschaft/Methode der Basisklasse in einer abgeleiteten Unterklasse zu überschreiben. Einzige Voraussetzung ist, daß die Sichtbarkeit dadurch nicht eingeschränkt wird.
Z.B.:
Code:
Basisklasse::test() // [B]public[/B] Unterklasse::test() // public (OK) Unterklasse::test() // protected (Access level Error) Unterklasse::test() // private (Access level Error) Basisklasse::test() // [B]protected[/B] Unterklasse::test() // public (OK) Unterklasse::test() // protected (OK) Unterklasse::test() // private (Access level Error) Basisklasse::test() // [B]private[/B] Unterklasse::test() // public (OK) Unterklasse::test() // protected (OK) Unterklasse::test() // private (OK)
Nun möchte ich von einer MySQL-Klasse eine Singleton-Klasse wie folgt ableiten:
PHP-Code:
class MySql {
protected function __construct() {
// Verbindung zur Datenbank aufbauen
}
}
class MySqlSingleton extends MySql{
private static $instance = null;
protected function __construct() {
parent::__construct();
}
public static function getInstance() {
if(self::$instance === null) {
self::$instance = new MySqlSingleton();
}
return self::$instance;
}
private final function __clone() {}
}
// $DB = new MySqlSingleton(); // Singleton, daher keine Objekte mit new möglich!
// $DB = new MySql(); // geht nicht wegen protected function __construct()
$DB = MySqlSingleton::getInstance();
$DB1 = MySqlSingleton::getInstance();
echo ($DB === $DB1)? "Ein Objekt":"Zwei Objekte"; // liefert Ein Objekt
Nun bin ich im Zusammenhang mit dem genannten Problem auf den folgenden Code gestoßen:
PHP-Code:
class MySqlSingleton extends MySQLi {
private static $instance = null;
protected function __construct($server,$user,$pass,$db) {
parent::__construct($server,$user,$pass,$db);
}
public static function getInstance($server,$user,$pass,$db) {
if(self::$instance === null) {
self::$instance = new MySqlSingleton($server,$user,$pass,$db);
}
return self::$instance;
}
private final function __clone() {}
}
// Singelton-Instanz
$DB_Single = MySqlSingleton::getInstance("localhost","user","passwort","datenbank");
// MySQLi-Instanz
$DB = new MySQLi ("localhost","user","passwort","datenbank");
Vielen Dank im Voraus für jede Hilfe.
jack
Kommentar