Datei wird in die Klasse statt in das Skript eingebunden

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

  • Datei wird in die Klasse statt in das Skript eingebunden

    Hallo zusammen..

    Der Titel sagt eigendlich schon relativ viel aus. Ich habe eine Klasse, mit einer Funktion 'LoadComponent()'. Dort sollten Verschiedene Dateien eingebunden werden.
    Die Klasse und Funktion führe ich in der admin.php aus. Nun werden die Dateien aber nur in der Klasse eingebunden und nicht im Skript, admin.php.

    Kann man dagegen was unternehmen?
    Bücher für Programmierer

  • #2
    Zitat von andygyr Beitrag anzeigen
    Kann man dagegen was unternehmen?
    ja, zuerst mal den code posten.

    peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      Ich weiss zwar nich was dass bringen soll, aber bitteschön:

      Die Funktion in der Klasse 'System':
      PHP-Code:
      function LoadComponent($ComponentId false) {
              global 
      $db;
              
              
      // Componenten Daten holen
              
      if($ComponentId && $db->id_select('Component', (int) $ComponentId)) {
                  
      $Component $db->gAssocArray();
              } else {
                  
      $db->select('Backend_Menue'"MenueStart = 'Yes'");
                  
      $db->id_select('Component'$db->g('MenueKomponent'));
                  
      $Component $db->gAssocArray(); 
                  if(
      count($Component)>1) die('Fehler: Mehrere Startkomponenten gewählt!');
              }        
              
              
      // Files includes
              
      foreach (glob(self::$S_INCLUDES_BACKEND_COMPONENTS_PATH.$Component[0]['ComponentPfad']."*.php") as $file) {
                  include(
      $file);
              }
              return 
      true;
          } 
      Ausschnitt admin.php:
      PHP-Code:
      // Dieser abschnitt ist unschön gelöst, ich weiss. Ist aber nur vorübergehend
      if(isset($_GET[System::$S_BACKEND_GET_VARS['component']])) {
          
      define('G_COMP'$_GET[System::$S_BACKEND_GET_VARS['component']]);
      } else {
          
      define('G_COMP'false);
      }
      //..
      $sys = new System;     // System Starten
      //..
      // Component laden
      $sys->LoadComponent(G_COMP); 
      Bücher für Programmierer

      Kommentar


      • #4
        das sieht alles nicht sehr koscher aus. zuerst solltest du auf global verzichten, das bringt dich in des teufels küche. ansonsten folgendes.

        du greifts hier bereits auf eine eigenschaft der klasse system zu:
        PHP-Code:
        System::$S_BACKEND_GET_VARS['component'
        das geht aber unter php5 nur, wenn diese als static deklariert wurde. ist dem so? außerdem solltest du die sichtbarkeitsstufen bei deinem methoden deklarieren.

        dann würde ich mir mal __autoload ansehen. die setzt du in der admin.php ein. ist imho viel einfacher und eleganter.

        peter
        Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
        Meine Seite

        Kommentar


        • #5
          static ist gesetzt.
          __autoload() wird nicht funktionieren, da ich nicht nur Klassen sondern auch andere php Dateien einbinde..
          Bücher für Programmierer

          Kommentar


          • #6
            error_reporting richtig eingestellt? was ergibt bei include($file) denn ein zusätzliches echo $file?

            peter
            Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
            Meine Seite

            Kommentar


            • #7
              error_reporting ist auf E_ALL, so ziemlich in jeder Datei ^^

              Wenn ich vor include($file); ein echo $file; mache, wird der Korrekte Dateinamen ausgespuckt.
              Die erste Datei die eingebunden wird greift auf die Variable $sys zu. $sys wurde ja in der admin.php gestartet. Da kommt dann entsprechend auch die Antwort: Notice: Undefined variable: sys in /srv/www/vhosts/cogax.ch/httpdocs/Cogax_CMS/includes/backend/components/components/Components.php on line 7

              Darum weiss ich ja, dass die Datei nur in die Klasse und nicht direkt in die admin.php eingebunden wird. Wenn ich echo $file; nach dem include($file); hinsetzte, kommt natürlich nix, da Das Skript beim Fehler abgebrochen wird.
              Bücher für Programmierer

              Kommentar


              • #8
                du erzeugst in der admin.php eine referenz auf die system-klasse. in der bindest du dann dateien ein. die können aber keinen zugriff auf $sys haben, da es keine normale variable sondern eine referenz ist. und wie willst du darauf zugreifen? das kann doch nicht funktionieren:
                PHP-Code:
                // test.php
                <?php
                  $files 
                = array ( 'bla.php''blubb.php');
                  include (
                'class.php');
                  
                $sys = new sys;
                  
                $sys -> incl($files);
                ?>
                // class.php
                <?php
                  
                class sys 
                  
                {    
                    public function 
                incl($arr)
                    {
                      foreach (
                $arr as $value)
                      {
                        include (
                $value);
                      }
                    }
                    public function 
                bla()
                    {
                      echo 
                'Blubb';
                    }
                  }
                ?>
                // blubb.php
                <?php
                 
                // und hier hauts dir eine fehlermeldung um die ohren
                 
                $sys -> bla();
                ?>
                peter
                Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
                Meine Seite

                Kommentar


                • #9
                  Ja, dein Codebeispiel entspricht ziemlich genau meinem Problem. Un dies ist nich weil $sys eine spezielle Vriabel ist, sondern weil die Dateien in die Klasse und nicht in die admin.php eingebunden werden. Bei einer stinknormalen Variabel passiert genau das gleiche:

                  PHP-Code:
                  // test.php
                  <?php
                    $files 
                  = array ( 'bla.php''blubb.php');
                    
                  $xx 'Blablabla';
                    include (
                  'class.php');
                    
                  $sys = new sys;
                    
                  $sys -> incl($files);
                  ?>
                  // class.php
                  <?php
                    
                  class sys 
                    
                  {    
                      public function 
                  incl($arr)
                      {
                        foreach (
                  $arr as $value)
                        {
                          include (
                  $value);
                        }
                      }
                      public function 
                  bla()
                      {
                        echo 
                  'Blubb';
                      }
                    }
                  ?>
                  // blubb.php
                  <?php
                   
                  // und hier hauts dir eine fehlermeldung um die ohren
                   
                  echo $xx;
                   
                  $sys -> bla();
                  ?>
                  Hier hab ich noch ne 'normale variabel' $xx angefügt. Es erscheint der gleiche Fehler: Notice: Undefined variable: xx in /srv/www/vhosts/cogax.ch/httpdocs/Cogax_CMS/includes/backend/components/components/Components.php on line 2
                  Bücher für Programmierer

                  Kommentar


                  • #10
                    Der inkludierte Code erbt den aktuellen Scope. In diesem existiert dein $sys einfach nicht. Ein global $sys würde es importieren - und deutlich machen wie verkorkts die Architektur ist.

                    Das hat übrigens nichts mit Klassen zu tun sondern ist eine Eigenschaft des Include-Mechanismus, funktioniert also auch mit einfachen Funktionen.
                    PHP-Code:
                    <?php // foo.php

                    $a 'foo';

                    function 
                    foo() {
                        
                    // global $a;    // <-- damit gehts
                        
                    include 'bar.php';
                    }

                    foo();
                    PHP-Code:
                    <?php // bar.php

                    echo $a;
                    Zuletzt geändert von onemorenerd; 11.06.2009, 17:42.

                    Kommentar


                    • #11
                      Achso.. OK, vielen Dank es geht!

                      ps: Verkorkst ist da gar nix
                      Bücher für Programmierer

                      Kommentar


                      • #12
                        Zitat von andygyr Beitrag anzeigen
                        ps: Verkorkst ist da gar nix
                        doch! sobald man mit global arbeiten muss, ist es verkorkst. sorry, aber isso.

                        peter
                        Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
                        Meine Seite

                        Kommentar


                        • #13
                          Zitat von andygyr Beitrag anzeigen
                          Achso.. OK, vielen Dank es geht!

                          ps: Verkorkst ist da gar nix
                          Das Wunderbare an der Arbeit mit Objekten[1] ist, dass alle Funktionen (Methoden) eines Objektes Zugriff auf beliebig viele gemeinsame Variablen (Properties) haben dürfen. Wenn da noch jemand mit globalen Variablen hantiert, darf man dessen Arbeits- oder Denkweise durchaus verkorkst nennen. ;-)

                          --
                          [1] Gleiches gilt für Klassen.
                          Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                          Kommentar

                          Lädt...
                          X