autoload geht nicht

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

  • autoload geht nicht

    Hi jungs,

    ich habe ein Problem mit autoload in einer Klasse:

    Wo ist da der Fehler ?

    weil autoload wird ja ausgeführt wenn man die Classe aufrugt mit new ...

    aber das geht nicht wieso ?

    PHP-Code:
    function __autoload() {
    $classes=array("mysql.class","file.class");
    parent::loadClasses($classes);
    }

    function 
    loadClasses($classes) {
    if(
    is_array($classes)) {
        foreach(
    $classes as $class) {
        
    $explodeFile=explode(".",$classes);
        if(
    $explodeFile[1] == "class") {
            
    $explodeFile=explode(".",$classes);
             require_once(
    "includes/classes/".$class.".php5");
             
    $this->includedClasses++;
          }
        }
      }


  • #2
    Re: autoload geht nicht

    Original geschrieben von meGa
    ich habe ein Problem mit autoload in einer Klasse
    wieso innerhalb einer klasse? __autoload() gehört in den globalen namensraum. ist ja auch unlogisch, __autoload in eine klasse zu packen, die erst geladen werden soll

    Kommentar


    • #3
      also einfach so function __autoload ?

      Kommentar


      • #4
        Original geschrieben von meGa
        also einfach so function __autoload ?
        ja, halt außerhalb der klasse, hier gibt es ein beispiel: Autoloading

        nur was du vorhast, sieht eher danach aus, ein array von klassen fest zu inkludieren. autoload lädt die klassen dagegen dynamisch bei bedarf nach.

        keine ahnung, was du genau vorhast

        Kommentar


        • #5
          Ich habe ne Main Klasse "CMS" und Sub klassen "extends" die sind ich verschiedenen dateien und die sollen eingebunden werden

          Kommentar


          • #6
            hast du den Link von 3DMax überhaupt angeschaut?
            wenn ja, dann sag bitte was du nicht verstanden hast.
            ausserdem erwartet __autoload ein parameter, was bei dir nicht der fall ist.
            Slava
            bituniverse.com

            Kommentar


            • #7
              Ahh gecheckt noch ne Frage was mache ich wenn ich jetzt z.b. die datei cms.class.php aufrufe mit autoload per new cms aber die Klasse dann die mysql.cms.php braucht ?

              Kommentar


              • #8
                Original geschrieben von meGa
                Ahh gecheckt ...
                nein, hast du nicht, weil ansonsten hätte sich deine letzte frage erübrigt.
                wenn ja, dann sag bitte was du nicht verstanden hast.

                Kommentar


                • #9
                  Ich habe nicht verstanden wie ich nun SubKlasse aufrufe ...

                  Config.php

                  PHP-Code:
                  function __autoload($class) {
                  require_once(
                  "classes/".$class.'.class.php5');
                  }


                  $cms=new cms
                  In der cms.class.php rufe ich die Klasse file auf mit "file::edit", die aber in einer anderen Datei liegt wie binde ich die da ein ?

                  Kommentar


                  • #10
                    Original geschrieben von meGa
                    Ahh gecheckt noch ne Frage was mache ich wenn ich jetzt z.b. die datei cms.class.php aufrufe mit autoload per new cms aber die Klasse dann die mysql.cms.php braucht ?
                    es ist empfohlen die classen dateien in ein ordner zu legen und die name für die dateien nach einer bestimter gleicher schema zu machen.
                    das wird dir die arbeit ersparen bei schreiben deiner autoload function.
                    es wäre optimal, wenn du alle dateien , die deine classen haben z.b.s class.classnamen.php nennst oder wie auch immer. hauptsache die function autoload muss nach einem von dir beschriebenen Prinzip die classen, die deine Anwendung braucht zu finden.
                    wenn deine dateien mit classen kein eindeutige zusamenhang zwischen class-name und datei-name haben, und die Änderung von dateinamen viel zu kompliziert ist, dann kannst du der Zusammenhänge zwischen classen und dateinamen in einem Datenbank oder in Array abspeichern.
                    z.b.s
                    PHP-Code:
                    <?php //class_datei.php
                    $class_datei=array();
                    $class_datei['cms']='include/cms.class.php';
                    $class_datei['mysql']='einordner/einedatei.php';
                    ....
                    ?>
                    und deine autoload müsste dann etwa so aussehen
                    PHP-Code:
                    function __autoload($classname){
                    include 
                    "class_datei.php" ;
                    if(isset(
                    $class_datei[$classname]))
                     {
                       include_once(
                    $class_datei[$classname]);
                     }
                    else die(
                    "classe $classname nicht gefunden");

                    Slava
                    bituniverse.com

                    Kommentar


                    • #11
                      Erm also die ganzen klasse liegen in "includes/classes/" also müsste ich die Klasse die die folgene benötig einfach davor includen oder ?

                      Kommentar


                      • #12
                        Original geschrieben von meGa
                        Erm also die ganzen klasse liegen in "includes/classes/" also müsste ich die Klasse die die folgene benötig einfach davor includen oder ?
                        genau, das ist doch prinzip von autoload.
                        PHP versucht ein Object zu initialisieren und braucht dafür die classendifinition.
                        wird die classe nicht gefunden, macht PHP ein letzte versuch und startet __autoload function, die nichts anderes machen muss, alls die datei, in der classe beschrieben ist zu includieren.
                        zbs
                        $a=new KeineAhnung;
                        php findet die classe KeineAhnung nicht, rufft autoload an, und übergibt als argument name von gesuhter classe
                        __autoload("KeineAhnung");
                        wenn autoload die classe nicht zur verfügung gestellt hat( mit normalen include, oder was auch immer) beendet PHP die Anwendung mit fehlermeldung, dass die classe nicht gefunden wurde.
                        Zuletzt geändert von Slava; 24.02.2007, 14:35.
                        Slava
                        bituniverse.com

                        Kommentar


                        • #13
                          ich glaube, dass ich mich nicht ganz richtig wegen include ausgedruckt habe, es geht in prinzip nicht unbedingt um eine Include, sonder darum, dass autoload classendifinition bereitstellt. dabei ist eigentlich egal, ob die classen-beschreibung per include oder auch auf eine andere weise bereit gestellt wird.
                          das wird z.b.s auch wunderbar functionieren
                          PHP-Code:
                          <?php
                          error_reporting
                          (E_ALL);
                          function 
                          __autoload($class){
                            eval(
                          " class $class { function hi(){echo 'hallo!';}} ");
                          }
                          $object=new KeineAhnung;
                          $object->hi();
                          ?>
                          Slava
                          bituniverse.com

                          Kommentar


                          • #14
                            Original geschrieben von Slava
                            ich glaube, dass ich mich nicht ganz richtig wegen include ausgedruckt habe, es geht in prinzip nicht unbedingt um eine Include, sonder darum, dass autoload classendifinition bereitstellt. dabei ist eigentlich egal, ob die classen-beschreibung per include oder auch auf eine andere weise bereit gestellt wird.
                            ich glaube, du hast dich schon sehr gut ausgedrückt, nur mega kann damit irgendwie nichts anfangen.

                            und ich finde, dass in autoload sehr wohl nur includes hineingehören, sonst macht es einfach keinen sinn. autoload soll den overhead unnötiger includes (also selten benutzter klassen) vermeiden und diese nur bei bedarf dynamisch nachladen. klassen, die bei jedem request benötigt werden, sollten dann allerdings auch hart kodiert zu beginn des scriptes inkludiert werden, ansonsten bringt autoload keinen nutzen.

                            Kommentar


                            • #15
                              -- falscher button

                              moderator, bitte löschen

                              Kommentar

                              Lädt...
                              X