Portal > Foren > PHP > PHP-Programmierung > Vor und Nachteile einer Globalen Variable
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 22.07.2008, 23:10 Nach oben    #1
nox
Benutzer
 
Registriert seit: 22.11.2006
Ort: Haan
Beiträge: 50
Standard Vor und Nachteile einer Globalen Variable

Hi,

zunächst mal vorweg, ich rede nicht von register_globals!

Also meine Frage ist ganz einfach, vielleicht hat der ein oder andere schon Erfahrungen gemacht. Ich schreibe gerade an einem System indem ich eine Variable (bsp. $XY). Diese Variable ist ein Objekt welches unteranderem die Datenbank Verwaltung und Smarty (Templatesystem) enthält.

Jetzt fragen sich wahrscheinlich die ersten, wozu das ganze? Ganz einfach ich möchte das ganze System etwas "Zentralisieren". Vor allem in Klassen und Funktionen ist es doch schneller "global $XY" als "global $Smary, $db, $mail....".

So jetzt denke ich mir hmm doch recht Praktisch, aber wahrscheinlich wird diese Variable doch recht viel Speicher fressen. Wie sieht es aus? Jemand Erfahrungen oder ist meine Sorge unbegründet?!

Gruß nox
__________________
nox ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.07.2008, 23:54 Nach oben    #2
Der Student
 
Benutzerbild von Flor1an
 
Registriert seit: 03.01.2007
Ort: München
Beiträge: 86
Standard

Wieso sollte die Variable "Speicher" fressen. Bei Objekten sind es nur Zeiger auf die entsprechenden Stellen wo das Objekt im Speicher liegt. Dass sollte so oder so nicht das Problem von globalen Variablen sein.

Funktionieren tuts auch. Aber das Problem ist wenn irgendwo mal eine dieser Variablen überschrieben wird wars das. Und bis du solche Fehler findest kann es teilweise etwas länger dauern ... musst ich selbst mal am eigenen Leib erfahren als ich ein bestehendes System etwas erweitern sollte und es globale Variablen gab die ich allerdings nicht kannte da diese nirgendwo dokumentiert waren.

Eine Möglichkeit wäre das Factory Pattern. Bedeutet du hast eine Klasse die als Singleton fungiert und die ganzen "globalen" Variablen beinhaltet.
Das bedeutet diese Klasse ist statisch, es kann also immer nur das zuerst initialisierte Objekt aufgerufen werden. In diesem Objekt speicherst du jetzt die anderen Objekte, also DB, Smarty, Mail etc.

Wenn du jetzt in irgend einer Klasse eine andere Aufrufen möchtest kannst du das so z.B. lösen:

PHP-Code:
<?php
class Smarty {
    public function 
tu_was_mit_der_db() {
        
$db FactoryClass::getInstance()->get('db');
        
$db->query(...);
    }

}
Du kapselst also alle globalen Variablen in der FactoryClass. So kann man Variablen nur noch überschreiben wenn man explizit die FactoryClass dazu auffordert. Es kann also nicht mehr aus versehen passieren.
__________________
Wenn ich du wäre, wäre ich lieber ich.

http://www.clubstars.net
http://www.x-tinct.de
Flor1an ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.07.2008, 14:45 Nach oben    #3
nox
Benutzer
 
Registriert seit: 22.11.2006
Ort: Haan
Beiträge: 50
Standard

Danke für deine Antwort!

Die Idee mit der FactoryClass finde ich klasse, werde mich später mal dranbegeben!

Danke nochmal und Gruß nox
__________________
nox ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 25.07.2008, 13:18 Nach oben    #4
Johannes Schlichenmaier
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 403
Standard

Falls dich eine zweite Meinung interessiert:
Ich versuche ebenfalls globale Variablen wenn möglich zu meiden (aus o.g. Gründen und aus Sauberkeit) und benutze lieber Singleton.
Übrigens kann man mit Singleton, get und set ganze nette Config-Klassen erstellen, bei denen Konfigurationsklassen rauskommen, mit denen man dann wie folgt auf einzelne Werte zugreifen kann:
PHP-Code:
$Config->mysql->user "root"
Nur so als Anmerkung
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
Jojo ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 26.07.2008, 13:31 Nach oben    #5
nox
Benutzer
 
Registriert seit: 22.11.2006
Ort: Haan
Beiträge: 50
Standard

Zitat:
Zitat von Jojo Beitrag anzeigen
Falls dich eine zweite Meinung interessiert:
Ich versuche ebenfalls globale Variablen wenn möglich zu meiden (aus o.g. Gründen und aus Sauberkeit) und benutze lieber Singleton.
Übrigens kann man mit Singleton, get und set ganze nette Config-Klassen erstellen, bei denen Konfigurationsklassen rauskommen, mit denen man dann wie folgt auf einzelne Werte zugreifen kann:
PHP-Code:
$Config->mysql->user "root"
Nur so als Anmerkung
Hmm, das ist eigentlich genau wie mein Lösungsansatz. Mit Singleton habe ich zuvor noch nie gearbeitet. Wo genau liegt der Unterschied?

Danke für deine Antwort

Gruß nox
__________________
nox ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.07.2008, 23:26 Nach oben    #6
Johannes Schlichenmaier
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 403
Standard

Zitat:
Zitat von nox Beitrag anzeigen
Mit Singleton habe ich zuvor noch nie gearbeitet. Wo genau liegt der Unterschied?
Singletons zeichnen sich dadurch aus, dass es nur eine Instanz zur Laufzeit gibt.
d.h. man kann bspw. in Teil A eines Scriptes in der Instanz einen Wert speichern und in Teil B diesen Wert wieder auslesen.


Eine Mini-Singelton-Klasse ist beispielsweise diese hier:

PHP-Code:
class Meine_Singleton_Klasse {
  private static 
$Instance null;
  private 
$wert;

  private function 
__construct() {
  }

  public static function 
getInstance() {
    if (
Meine_Singleton_Klasse::Instance == null) {
      
Meine_Singleton_Klasse::Instance = new Meine_Singleton_Klasse();
    }
    return 
Meine_Singleton_Klasse::Instance;
  }

  public function 
setWert($wert) {
    
$this->wert $wert;
  }

  public function 
getWert() {
    return 
$this->wert;
  }

  public function 
__clone() {
  }

Die magic function __clone muss man (korrekterweise) überschreiben, damit man von außen die Instanz nicht klonen kann, sonst wärs keine Singleton mehr...

Mit dieser Klasse kann man damit dann z.B. folgendes machen:
PHP-Code:
<?php
// nach Einbinden der Klasse

$Eins Meine_Singleton_Klasse::getInstance();
$Eins->setWert('muhaha');


$Zwei Meine_Singleton_Klasse::getInstance();
echo 
$Zwei->getWert();
Ausgabe ist dann
Code:
muhaha
Btw. Ham wir dazu eigentlich ein Tutorial?
Ich kanns grad nicht testen, bei funktioniert irgendwie grad kein Suchbutton...
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int

Geändert von Jojo (01.08.2008 um 13:40 Uhr) Grund: Dumme Fehler in getInstance ausgemerzt und Member $wert das static weggenommen...
Jojo ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 01.08.2008, 07:10 Nach oben    #7
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.374
Standard

Zitat:
Zitat von Jojo Beitrag anzeigen
Btw. Ham wir dazu eigentlich ein Tutorial?
Nein, haben wir leider nicht - ich nehme aber gerne dazu eines an!
Einfach schreiben und im Tutorial-Briefkasten posten.
__________________

Umfragen:
bitte beachten: Vorschläge für künftige Umfragen
Woher weißt du vom developers-guide?

Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw.
Danke!
Jann Hendrik ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.08.2008, 16:29 Nach oben    #8
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 853
Standard

Singletons sind letztlich nichts anderes, als globale Variablen und von daher geht das hier vielleicht ein wenig am Thema vorbei, denn die Vor- und Nachteile sind die selben.

Zentraler Nachteil von Globalen ist, dass dein Stückchen Code, also deine Klasse oder Funktion damit eine Schnittstelle zu einem anderen Teil deines Codes hat, der nicht so ganz transparent ist.

Wenn du die benötigten Objekte den Funktionen oder dem Konstruktor übergibst, dann tunnelst du quasi alle Abhängigkeiten (mehr oder weniger) und hast nicht noch irgendwelche Fehlerquellen rumschwirren, die von einem irgendwie undurchsichtigen Zustand deiner Anwendung abhängig sind.

Ich würde mir also sehr genau anschauen, welche Objekte wirklich von allen Klassen benötigt werden bzw. ob sich diese nicht besser über Fabriken übergeben lassen (die dann die Objekte kennen und den zu bauenden Objekten übergeben können, ohne dass die Klienten dieser Objekte etwas damit zu tun haben müssen).

Bastian
Basti ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
PingBacks sind an
RefBacks sind aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
php variable in JS anzeigen Galge JavaScript und AJAX 9 28.03.2007 14:44
[Smarty] Variable in variable aus Konfigurationsdatei umwandeln? thrawn PEAR, PECL und Frameworks 9 20.07.2006 11:52
[Realisierung] [Brainstroming] Variable Wertanzahl Du-weisst-schon-wer Datenbanken 5 08.01.2006 20:41
Probleme mit Variable in SQL Anweisung Doggi Datenbanken 10 15.12.2005 14:04
Variablennamen mit Variable. Creativ PHP-Programmierung 9 30.11.2005 08:40


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:34 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45