Zwei Fragen zu Klassen/Funktionen/...

  • Hallo,


    seit kurzem beschäftige ich mich etwas mit PHP, nun stehe ich vor zwei Problemen und hoffe, dass mir hier jemand behilflich sein kann.


    Ich habe eine Konfigurationsdatei, wo ich allgemeine Daten speicher, diese speicher ich mittels Konstanten.
    Nun möchte ich gerne die Konfig-Datei über eine globale Klasse laden und dann ganz normal verwenden können.
    Versucht habe ich das nun so:


    PHP
    <?phpclass GlobalClass {
      public function __construct() {    $this->loadConfig();  }
      function loadConfig() {    require_once __DIR__.'config.php';  }}?>




    Da ich Smarty nutze, möchte ich diese Konstanten nun mittels Smarty ganz normal in meinem TPL nutzen.
    Leider funktioniert das nicht (wird nichts ausgegeben). Mit dieser Funktion. Wenn ich die Datei hingegen direkt im TPL include, dann geht das.


    Das zweite Problem:


    Liegt bei Smarty. Da ich die Smarty-Klasse nicht in jeder Datei neu laden will, wollte ich es ebenfalls über diese globale Klasse machen.


    Versucht habe ich es wie folgt:


    PHP
    class GlobalClass {  public static $smarty  public function __construct() {    $this->initSmartyTPL();  }  function initSmartyTPL() {    self::$smarty = new smarty;  }}?>









    PHP
    class MySite {
      public function getSite() {
      //... DB-Abfragen etc.
      GlobalClass::$smarty->assignByRef('bla', $bla);  GlobalClass::$smarty->display('MySite.tpl');
      }
    }



    Resultiert in der Fehlermeldung "Call to a Member function assignByRef() on a non-object in ..."


    Würde mich freuen, wenn mir jemand weiterhelfen könnte...

  • Stichwort "Singleton"



    Auf diese Weise ist
    - Singleton vom überall erreichbar (global)
    - zB smarty nur ein mal instanziert



    hier mal ein ausführliches Bsp / Tests:
    (hatte das Thema vor paar Wochen =)

  • Ich danke Dir vielmals. Es funktioniert klasse.


    Hab mir Dein langes Beispielscript auch eben mal angeschaut. Da ist mir aufgefallen, in Zeile 30 und 40 sind die Funktionen __construct() und __clone() leer, hat das einen tieferen Sinn? Wenn ja warum macht man das so?

  • Ok danke schonmal.


    Jetzt habe ich noch eine andere Frage zum Autload bzw. spl_autoload_register.
    Welchen Sinn genau soll das haben? Was ich erst darunter verstand war: Ich geb der Funktion einen Pfad unter der sie die Klassen finden kann um sie dann - wenn sie benötigt werden - automatisch zu laden.
    Stattdessen muss ich die Klasse im Grunde ja jedesmal selber laden (muss die Funktion ja aufrufen und ihr die zu ladende Klasse mitteilen). Wo ist da der Sinn? Da kann ich doch auch bei der Methode bleiben, einfach die benötigten Klassen direkt über include_once zu laden?
    Gibts das irgendwelche Gründe, Vorteile oder irgendeinen Sinn (außer 42), warum ich irgendeine Autload-Funktion nutzen sollte?
    Oder hab ich da einfach nur was falsch verstanden bei der Verwendung? :D

  • autoload ist kein kleines Thema, aber ich versuchs mal kurz:


    Es gibt verschiedene Wege -- google mal nach "php autoload psr-0" oder guck hier http://www.php-fig.org/psr/psr-0/
    Hier erstmal die spl_autoload_register():

    PHP
    spl_autoload_register(
        function($classname){}, // die eigtliche funktion zum auto-laden
        true, // throw exception wenn nicht möglich klasse zu laden
        false // prepend (vorn anhängen) diese autoload funktion (es kann mehrere geben)
    );


    Ich persönlich hatte immer eigene autoloads geschrieben - also nicht psr-0 o.ä. genutzt.
    Das sah dann zB so aus:


    Das kann aber bissl kaotisch werden, um so mehr Pfade hinzukommen. (nicht empfohlen)


    Seit dem ich mit Magento arbeite find ich deren autoload ziemlich geil:


    Was passiert da:
    Jede Klasse hat im Name den Pfad (keine Namespaces -- die sind undynamisch und braucht kein Sack).
    Unterstriche werden in Slashes umgewandelt, woraus sich der Pfad ergibt.

    PHP
    class Das_Hier_Ist_Also_Meine_Class {}
    // ergibt also den Pfad: 
    // Das/Hier/Ist/Also/Meine/Class.php


    Wenn Du nun also einen Ordner für alle includes hast, dann kannst Du:


    Das gibt lange Klassennamen, was aber auch gleich wieder von Vorteil ist:

    PHP
    // macht keinen Sinn, dient nur der "show"
    $obj = new Mage_Adminhtml_CustomerController();
    // es wird sicherlich 
    // eine Datei CustomerController.php in 
    // {inc path} Mage/Adminhtml/
    // liegen.


    Ich wette Du kannst Dir jetzt zusammenreimen, wo die Klasse Mage_Admin_Model_Resource_User_Collection liegt =)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!