[OOP] Objekte werden nicht erkannt?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [OOP] Objekte werden nicht erkannt?

    Ich bins mal wieder.

    Hab schon ein bisschen das Board und php.net durchforstet, und vielleicht hab ich die Lösung bereits gelesen und habe sie nur nicht verstanden... daher schreib ich doch mal lieber einen Thread ^^

    Ich habe für mein Projekt diverse Libraries erstellt, die alle Klassen entahlten, mit denen ich später arbeiten will.
    Jetzt bin ich soweit, dass ich endlich die Templates mit einbinden will. Dazu habe ich eine eigene Templateklasse erstellt (mit SMARTY-Erweiterung)
    Und da ich ein fauler Programmierer bin :P lade ich die Libraries mit einer statischen Methode Libraries::load(string $libraries).
    Damit ich die geladenen Klassen nicht in jedem Skript manuell instanzieren muss, dachte ich mir, es wäre ganz praktisch, das gleich beim Laden zu erledigen.
    Daher habe ich die Funktion updateInstances(string $library) erstellt.
    Diese sieht so aus:

    PHP-Code:
    /**
     * Autoinstancing of libraries
     * 
     * Creating instances of standard-libraries and supress errormessages if
     * they are not yet loaded. [Libraries] and [ErrorHandler] do not need to be instanced, all functions
     * are internal or static. [MySQL] must not be instanced, as it is a required class for DataBase and therefore
     * already instanced.
     * Only libraries included in [classObjects.txt] are loaded.
     * 
     * @return void
     */
    function updateInstances($library)
    {
        switch (
    $library) {
            case 
    'Templates':
                
    $tpl = new Templates;
                break;
            
            case 
    'Pages':
                
    $page = new Pages;
                break;
        }

    Will ich nun jedoch in der index.php z.B. $tpl->load(string $template) ausführe, erhalte ich die Fehlermeldung, dass $tpl kein Objekt sei.

    Das versteh ich allerdings nicht so ganz, denn es wird ja eindeutig erstellt. Habe sogar mit diversen Prüfungen den kompletten Verlauf aller require_once() etc. auflisten können:

    Code:
    Level 2 required library: lib.Libraries.php
    Level 3 required library: lib.ErrorHandler.php
    Level 2 required library: lib.Config.php
    Level 3 optional library: lib.Pages.php
    [$library] = Pages
    Class [Pages] instanced
    Level 3 optional library: lib.Templates.php
    [$library] = Templates
    Class [Templates] instanced
    
    Fatal error: Call to a member function loadStyle() on a non-object in /draco/page.home.php on line 16
    Daher verstehe ich nicht ganz, wieso er mir diese Fehlermeldung bringt
    This is what happens when an unstoppable force meets an immovable object.

  • #2
    vorher das Objekt initalisiert?

    PHP-Code:
    $tpl = new Bla_Klasse(); 
    tutorial: peterkropff.de schattenbaum.de tut.php-quake.net
    documentation: php.net mysql.com framework.zend.com

    Die Nachtwache!

    Kommentar


    • #3
      Na das wird doch in der updateInstances()-Funktion erledigt?
      This is what happens when an unstoppable force meets an immovable object.

      Kommentar


      • #4
        Globaler Scope <-> Funktionsscope!
        Siehe Manual!

        Kommentar


        • #5
          Verstehe ich das richtig, dass das was ich vorhabe also garnicht möglich ist?

          Ich habe mal versucht, global oder $GLOBALS[''] auf die Objekte anzuwenden, hat aber auch zu keinem anderen Ergebnis geführt...
          This is what happens when an unstoppable force meets an immovable object.

          Kommentar


          • #6
            oh sorry hab ich total übersehen liegt wohl an der nachtschicht, dass ich so früh am morgen noch zu nix zu gebrauchen bin.

            wie desaster es schon schrieb. gültigkeitsbereiche von variablen.
            tutorial: peterkropff.de schattenbaum.de tut.php-quake.net
            documentation: php.net mysql.com framework.zend.com

            Die Nachtwache!

            Kommentar


            • #7
              Und kann ich das problem mit

              global $tpl;

              oder

              $GLOBALS['tpl'];

              lösen?

              Laut der Fehlermeldung eben nicht... aber da musses doch ne Möglichkeit geben
              This is what happens when an unstoppable force meets an immovable object.

              Kommentar


              • #8
                wenn das doch ein Objekt in deiner Klasse ist und du diese mit
                PHP-Code:
                var $tpl
                deklariert hast kannst doch mittels
                PHP-Code:
                $this -> tpl = new bla(); 
                machen

                Kommentar


                • #9
                  Jo ich will $tpl->machwas(); aber nicht in der datei benutzen, in der ich $tpl = new Templates; deklariert habe...

                  Sondern eben in einer anderen, und das geht ja anscheinend wegen dieser zu geringen Gültigkeit...

                  Also such ich nach ner Möglichkeit, das in der anderen Datei auch zu benutzen^^
                  This is what happens when an unstoppable force meets an immovable object.

                  Kommentar


                  • #10
                    in welcher Datei ist den $tpl zu finden und in welcher findet der aufruf statt und wie sind die beiden Dateien miteinander verknüpft?

                    Kommentar


                    • #11
                      Also.

                      Server startet natürlich mit der /index.php.
                      Darin wird dann /lib/lib.Config.php eingebunden.
                      Dort wird /lib/lib.Libaries.php eingebunden. Darin wird auch updateInstances() definiert.

                      Wieder in der /index.php wird nun /page.home.php eingebunden. Darin soll dann $tpl->loadStyle() ausgeführt werden.
                      This is what happens when an unstoppable force meets an immovable object.

                      Kommentar


                      • #12
                        Dabei kommt mir noch eine Idee gekommen. Gibts ne Möglichkeit, einer Klasse automatisch nen Objekt zu geben, sobald sie geladen wird?

                        Also irgendwas im Sinne von

                        PHP-Code:
                        class Klasse
                        {
                         function 
                        __automatische-instanz-funktion($objektname)
                         {
                          
                        $objektname = new Klasse;
                         }

                        Und zwar so, dass $objektname global benutzt werden kann als $objektname->machwas();?

                        Oder ist das alles Wunschdenken?^^
                        This is what happens when an unstoppable force meets an immovable object.

                        Kommentar


                        • #13
                          Du suchst scheinbar das Singleton oder auch das Registry Design Pattern.
                          Wikipedia gibt Auskunft!
                          Wir werden alle sterben

                          Kommentar


                          • #14
                            Hmmm also bei singleton hab ich das so verstanden, dass ich trotzdem einmal etwas ähnliches wie

                            $obj = Class::method();

                            ausführen muss, damit ich dann

                            $obj->method2();

                            benutzen kann.

                            Was ich suche, ist ja eine Möglichkeit, in der Datei wo ich es brauche direkt mit

                            $obj->method2();

                            zu starten, ohne in dieser Datei nochmal $obj näher zu definieren. Das soll am besten gleich beim Laden der Klasse passieren...
                            This is what happens when an unstoppable force meets an immovable object.

                            Kommentar


                            • #15
                              Dann mußt du wieder eine Variable im globalen Namensraum setzen!
                              Das wiederspricht der "Reinen OOP Lehre"!!

                              Aber was hindert dich eine Regeistry zu nutzen?
                              PHP-Code:
                              // irgendwo in der Config.php o.ä.
                              Registry::add(new klassenname($parameter));



                              //Später irgendwo öfter im Script:
                              Registry::dowith('klassenname')->methode_tuwas('daten');

                              // mit PHP >= 5.3 wird auch folgendes möglich sein 
                              // ungetestet (weil zu faul)
                              Registry::klassenname->methode_tuwas('daten');
                              // wegen der Einführung statischer __get usw. 
                              Wir werden alle sterben

                              Kommentar

                              Lädt...
                              X