Datei wird in die Klasse statt in das Skript eingebunden

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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
    Originally posted by andygyr View Post
    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

    Comment


    • #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

      Comment


      • #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

        Comment


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

          Comment


          • #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

            Comment


            • #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

              Comment


              • #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

                Comment


                • #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

                  Comment


                  • #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;
                    Last edited by onemorenerd; 11-06-2009, 16:42.

                    Comment


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

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

                      Comment


                      • #12
                        Originally posted by andygyr View Post
                        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

                        Comment


                        • #13
                          Originally posted by andygyr View Post
                          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!

                          Comment

                          Working...
                          X