global: pass by reference/value

  • Moschään !


    Der OOP-Denkfehler-Thread hat mich zum nachdenken angeregt.


    Im Augenblick nutze ich im CMS eine einmalig instanzierte Klasse $db_worker mit Funktionen á la doselect(), doinsert(), doupdate(), etc.


    Und das Beste - es funktioniert ;)
    So weit so gut ! Läuft durchgängig und problemlos im "direkten" PHP/HTML-Code.


    Brauche ich jetzt die DB innerhalb einer Funktion, referenziere ich dort $db_worker mittels "global $db_worker;", bin ich innerhalb einer anderen Klasse, dekoriere ich deren Code mittels "... extends _db_worker"


    Frage(n) - Nutze ich das Wort "referenziere" richtig ?
    Setzt das Schlüsselwort "global" wirklich einen Zeiger, oder wird PHP-intern de facto doch eine zweite "Quasi-Instanz" geschaffen ? Hat jemand einen Hinweis, ob und wie ich da optimieren könnte ?
    Wenn nicht, ist eine solche DB-Worker-Klasse doch eigentlich die einfachste und durchgängigste Lösung - Warum gibts dann überhaupt ein Singleton Pattern ?

    quo errat demonstrator

  • Singleton ist dafür da, eine Klasse wirklich nur einmal zu instanzieren. Das ist für einige Fälle wichtig. Das Problem ist, das PHP kein echtes Singleton zur Verfügung stellt und man daher mit Umwegen ein Singleton definieren muss.


    Man kann sich das auch einfacher machen, in dem man z.B. die DB-Klasse direkt global referenziert


    PHP
    1. $GLOBALS['MY_DB'] = new dbClass();


    So kann man jederzeit auf DB zugreifen


    PHP
    1. $GLOBALS['MY_DB']->doSelect($sql);


    und hat den gleichen Effekt wie bei einem Singleton.


    An diesem Beispiel zeigt sich leider auch, das PHP noch Mankos im OOP-Bereich hat, ein Grund warum bei einigen Enterpriselösungen nicht PHP benutzt wird.