Sky.NET (17.06.2014)
Thema: global benutzen = nicht gut?
-
17.06.2014, 09:07 #1
global benutzen = nicht gut?
Hallo!
Ich verwende in PHP für Dinge die man oft braucht globale Variablen. Ein Beispiel ist die Datenbank. Die wird beim starten einmal connected
PHP-Code:$db = new Dbase();
$db->connect(...)
PHP-Code:function foo() {
global $db;
$data = $db->fetch_row('select ...');
}
PHP-Code:class Dbase {
private static $instance;
public function get() {
return static::$instance;
}
}
PHP-Code:function foo() {
$data = Dbase->get()->fetch_row('select ...');
}
Dann frag ich mich aber wieso ich die Datenbank Klasse überhaupt instanzieren soll? Anstatt ein unnötiges Objekt anzulegen könnte ich doch einfach die ganze Klasse statisch machen:
PHP-Code:class Dbase {
public static function connect() { ... }
public static function fetch_row($sql) {...}
...
}
PHP-Code:global $wpdb;
$results = $wpdb->get_results( 'SELECT * FROM wp_options WHERE option_id = 1', OBJECT );
Habe ich also doch etwas übersehen und es gibt Gründe wieso man lieber eine Instanz benutzen sollte und dann überall mit global darauf zugreift? Ich bin verwirrt!
-
17.06.2014, 10:46 #2
AW: global benutzen = nicht gut?
Grundsätzlich gilt immer - nicht nur in PHP, sondern auch in jeder anderen Sprache, die objektorientiert ist/unterstützt - den Scope so klein wie möglich zu halten.
Das was du statische Klasse nennst ist ein Entwurfsmuster. Eins von vielen, die sich im Laufe der Zeit etabliert haben. Das vorliegende Pattern nennt sich Singleton. Dein kleiner Codeausschnitt zeigt ungefähr auch schon, wie ein Singleton aufgebaut ist. Meistens versieht der Entwickler es noch mit Lazy Initialization. In der get-Methode wird geprüft, ob bereits eine gültige Instanz vorliegt: Wenn ja, wird sie zurückgegeben; wenn nicht, wird sie erzeugt und dann zurückgegeben.
Wenn man ein Objekt überall im übrigen Code braucht, bietet sich das Singleton an. Es kann aber auch missbraucht werden, weil es eben dadurch so einfach ist, sich um das objektorientierte Design keine Gedanken machen zu müssen und einfach viel zu viel zum Singleton macht.
Zitat von Jokuu
-
The Following User Says Thank You to Nuebel For This Useful Post:
-
17.06.2014, 11:48 #3
AW: global benutzen = nicht gut?
Das kann ich verstehen, versuche auch nicht alles auf teufel komm raus so kurz wie möglich zu machen. In dem Fall sehe ich aber effektiv keinen Unterschied außer dass ich das global eben jedes mal brauche. Wenn man Code kürzer machen kann obwohl er das gleiche macht und ohne dass er unlesbar wird halte ich das nicht für schlecht. Wo soll denn da die Lesbarkeit leiden wenn ich die Datenbankklasse statisch mache? Da ändert sich ja nichts, nur mache ich dann direkt Database::fetch_row anstatt Database::get->fetchRow.
Ich sehe da einfach keinen Vorteil Singleton zu nutzen: Es wird ein Objekt erzeugt auf das statisch zugegriffen wird. Also ist das Objekt doch nutzlos und belegt unnötig Speicher. Verstehe mich nicht falsch, ich will dadurch nicht sagen alle Objekte sind unnötig weil man sie doch einfach statisch machen kann Ich habe in Java einen Chat also Server und Client programmiert. Da habe ich eine Klasse Chatter geschrieben und für jeden User eine Instanz dieser Klasse erstellt.
Für die Chatuser fand ich es sehr nützlich Objekte erstellen zu können. Da macht es Sinn. Ich wüsste gar nicht wie ich das unobjektorientiert (gibt es das Wort? ) machen sollte. Aber bei einer Datenbankklasse sehe ich keine Vorteile, die mir ein Objekt bringt. Hier könnte ich doch genau so gut die Klasse statisch machen. Ich sehe allgemein keinen Vorteil der objektorientierung, wenn nur eine Instanz gebraucht wird.
Falls es Gründe gibt die ich nicht kenne bitte ich um Aufklärung. Es geht mir wie gesagt nicht darum mit der "Das kann man doch sowieso alles statisch machen" Keule auf OOP einzuschlagen. Ich sehe hier einfach nur keinen Vorteil. Große Software wie Wordpress löst es aber trotzdem mit einem Objekt. Auch in vielen Tutorials wird ein Objekt erzeugt. Ich würde gerne verstehen was dabei gedacht wurde.
Den einzigen Vorteil den ich sehe ist, dass man durch mehrere Instanzen problemlos Verbindungen zu mehreren Datenbanken herstellen könnte. Das scheint mir aber ein theoretischer Vorteil zu sein der praktisch sogut wie nie gebraucht wird. Mir fällt kein sinnvoller Zweck ein wofür man in der Webprogrammierung mehrere Datenbanken gleichzeitig brauchen würde. Normal hat Scheint also ein sehr seltener Spezialfall zu sein den man wohl problemlos vernachlässigen kann.Meine Tochter neulich im Zoo in der Arktisabteilung: "Guck mal Papi, da sind Linuxe!"
-
17.06.2014, 12:30 #4
AW: global benutzen = nicht gut?
Zitat von Jokuu
Zitat von Nuebel
Im Speziellen für Datenbankverbindungen, hat sich mit der neuen PHP-Version Einiges getan, meine ich. Bin da nicht ganz up-to-date, da ich mit PHP kaum etwas zu tun habe.
Zitat von Jokuu
Eine mögliche Reaktion darauf wäre, sich Was-wäre-wenn-Fragen zu stellen. Was wäre, wenn ich meine Abfragen vorher noch bearbeiten möchte? Im Code überall nach dem Aufruf von $db->query zu suchen und davor Etwas einfügen? Mit guten Texteditoren sogar mit geringem Aufwand möglich, aber besser wäre es doch, an einer Stelle es zu tun: In der Datenbankklasse mit ggf. überschriebener query-Methode.
In der hobbymäßigen Programmierung darf das vielleicht vernachlässigt werden, aber schaden kann es nicht.
-
The Following User Says Thank You to Nuebel For This Useful Post:
Jokuu (24.06.2014)
-
24.06.2014, 21:46 #5
AW: global benutzen = nicht gut?
Vererbung habe ich mir auch schon angeschaut. Rein aus interesse habe ich meine Datenbankklasse auch versucht sehr flexibel aufzubauen. Ich habe eine Wrapper-Klasse, in der sich die Instanz der eigentlichen Db-Klasse befindet:
PHP-Code:class Dbase{
private static $dbInstance;
public static function get(){
return static::$dbInstance;
}
public static function create($type){
...
}
}
PHP-Code:interface Database {
public function query($qString);
public function connect($databaseHost, $databasePort, $databaseUsername, $databasePassword, $databaseName);
[...]
}
Konsequent habe ich OOP nicht umgesetzt. Aber nicht aus nachlässigkeit sondern bewusst. Ich dachte mir einfach, dass es sinnvoll wäre Objekte nur da zu benutzen wo es Sinn macht. Wo es keinen macht habe ich einfach statische Funktionen erzeugt. Wobei diese dann immer zu einer Klasse gehören, also keine reinen Dateien die nur aus Funktionen bestehen wie
PHP-Code:function xy() { ... }
function abc() { ... }
PHP-Code:class contentHelper {
public static function cleanContent($content) { ... }
}
Meine Tochter neulich im Zoo in der Arktisabteilung: "Guck mal Papi, da sind Linuxe!"
Ähnliche Themen
-
Counter-strike Global Offensive
Von Ricardo1337 im Forum Gaming AllgemeinAntworten: 1Letzter Beitrag: 18.12.2013, 07:39 -
Counter-Strike: Global Offensive
Von k i N Z u im Forum Gaming AllgemeinAntworten: 13Letzter Beitrag: 24.11.2011, 21:07
Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.