Ankündigung

Einklappen
Keine Ankündigung bisher.

Autloader unter Linux

Einklappen

Neue Werbung 2019

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

  • Autloader unter Linux

    Hi Leute,

    ich habe ein kleines Problem. Und Zwar habe ich nun mein Script auf ein Linux System hoch geladen und nun werden keine Klassen mehr automatisch nachgeladen.

    Bei Windows war es egal ob ich nun hinschreibe
    PHP-Code:
    $home = new Home();
    echo 
    $home->getHTMLCode(); 
    oder
    PHP-Code:
    $home = new home();
    echo 
    $home->getHTMLCode(); 
    und Linux spielt aber die Groß und Klein -schreibung eine rolle. Denn auf dem Linux System kommt nun die Meldung class 'home' not Found.

    Ist das nun eine Apache Einstellung oder ist es wirklich ein Bug der spl_autoload_register() Funktion?

    MFG
    apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

  • #2
    Unter Linux spielt Groß-Kleinschreibung tatsächlich eine Rolle und soweit ich weiß gibt es da auch keine Apache-Einstellung um das zu umgehen.

    Ich würde vorschlagen du änderst das einfach in deinem Script - also das die Groß-Kleinschreibung immer beachtet wird. Ist sowieso sauberer und dann hast du später auch keine Probleme wenn dus nochmal auf nem anderen Server laufen lassen willst

    Kommentar


    • #3
      Hallo BlackScorp,

      vielleicht hilft dir dieser Link weiter, lese mir das auch grad durch, weil ich wohl bald das gleiche Problem haben werde

      http://bugs.php.net/bug.php?id=49625

      VG
      infi

      Kommentar


      • #4
        Das Problem ist folgender. Ich habe vor ,Klassen über URL aufzurufen, bzw deren Methoden.

        angenommen ich rufe foobar.de/?home auf dann wird im Quellcode folgendes aufgerufen:

        PHP-Code:
         $get array_keys($_GET);
        $className $get[0];
        $class = new $className();
        echo 
        $class->displayHTMLCode(); 
        natürlich prüfe ich vorher allesmögliche bevor ich eine instanz der klasse anlege. Ich könnte ja zb ucfirst für den klassennamen verwenden aber ich habe auch klassen , die nicht nur mit dem Großen buchstaben anfangen , zb UserAccount und noch weitere.. wie sollte ich da am besten vorgehen? URL gleich so einzutragen wie der Klassenname ist? Also foobar.de/?Home
        und foobar.de/?Klasse
        apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

        Kommentar


        • #5
          http://www.php.de/board-support/anno...URLs_maskieren
          Bitte Beitrag anpassen!
          [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

          Kommentar


          • #6
            Wie sieht denn dein Autoloader aus?
            Ich hatte das Problem bisher noch nicht, kann also nicht aus Erfahrung sprechen, aber liegt das nicht nur am Dateisystem? Dann würde es ja mit folgendem funktionieren, solange deine Dateien alle kleingeschrieben sind:

            PHP-Code:
            function __autoload($class)
            {
                require_once 
            strtolower($class) . '.php';

            Alternativ gibst du in der URL einfach den korrekten Klassennamen an, oder nutzt statt CamelCase Underscores (User_Model), an denen du den Klassennamen dann aufsplitten und mit ucfirst() dann bearbeiten kannst...
            Programming today is a race between developers striving to build better idiot-proof programs, and the universe trying to produce better idiots. So far, the universe is winning.

            Kommentar


            • #7
              naja ich habe gelesen dass __autoload eine langsamere funktion ist, im vergleich zu spl_autload_register.

              Meine Autload Klasse sieht so aus:

              PHP-Code:
              <?php

              class AutoLoader {
                  private static 
              $path = array(
                      
              'core'
                  
              );

                  public static function 
              load($className) {
                      
                      foreach (
              self::$path as $path) {
                          
              $fullPath $path DS . ($className) . '.class.php';
                          if (
              is_file($fullPath)) {
                              require_once 
              $fullPath;
                          }
                      }
                  }

                  public static function 
              importDir($path) {
                      
              self::$path[] = $path;
                  }

              }
              und aufruf:

              PHP-Code:
              require_once 'Autoloader.class.php';
              AutoLoader::importDir(ROOT_DIR DS'classes'); //Namespace einbinden
              spl_autoload_register('AutoLoader::load'); 
              ja ich werde wohl oder übel die Links dann genauso wie die Klassennamen angeben...
              apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

              Kommentar


              • #8
                Zitat von bitsnack Beitrag anzeigen
                Alternativ gibst du in der URL einfach den korrekten Klassennamen an, oder nutzt statt CamelCase Underscores (User_Model), an denen du den Klassennamen dann aufsplitten und mit ucfirst() dann bearbeiten kannst...
                Puh dann habe ich nochmal Glück gehabt . Meine Klassennamen sehen doch ein wenig anders aus.

                Mit Underscores hatte ich auch mal gemacht und auf korrekt geschriebene Klassennamen in der URL würde ich mich nicht verlassen...

                PHP-Code:
                $classParts explode('_'$className);
                    foreach(
                $classParts as &$part) {
                    
                $part ucfirst($part);
                    }
                $className implode('_',$classParts); 

                Kommentar


                • #9
                  Es ist klar dass das beides nicht die besten Lösungen sind, aber eine bessere Möglichkeit fällt mir auch nicht ein...
                  Programming today is a race between developers striving to build better idiot-proof programs, and the universe trying to produce better idiots. So far, the universe is winning.

                  Kommentar


                  • #10
                    ja aber befor ich da mit explode und foreach arbeite usw, gebe ich lieber gleich den klassennamen richtig in die url ein, sonst wäre das ja unnötiger ressourcen verbrauch
                    apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

                    Kommentar


                    • #11
                      Ich mache das in meinem neuen System etwas anders, ich habe mir eine PathHelper Klasse geschrieben, die kann mit den beiden Arten von URLs umgehen (mit modrewrite modifiziert und php üblich mit Parametern durch ? und & anegegeben).

                      Lasse mir die gesamte URL in ein Array schreiben. In meinem Verzeichnissen wie z.B. News habe ich Klassen drin. In meiner URL stehen dann noch etwas wie PostNews und alle Klassen die etwas mit PostNews zu haben werden dann durch meine AutoLoader Klasse geladen.

                      Ich finde man sollte sich bei Klassenbenahmung auf eine Namensgebung einigen und nicht mal so oder mal so.

                      BlackScorp, warum baust du deinen AutoLoader als Singletin auf? Das finde ich in dem Fall eher nicht effektiv. Warum sollte es nur eine einzige Instanz eines Autoloaders geben? Ich halte von dem SingleTon sowieso nicht viel und finde das in dem Fall sogar vollkommen daneben (ist aber nur meine Meinung).

                      Gruß Litter
                      Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
                      [URL]http://www.lit-web.de[/URL]

                      Kommentar


                      • #12
                        einfach aus dem grund, weil ich zu spät erfahren habe , dass man im spl_autoload_register ein array mit klassenname und methodenname übergeben kann im grunde spielt es ja keine rolle , zz reicht für mich eine autoload funktion völlig aus. Aber ist denn meine Autoload klasse eine Singleton variante? ich sehe dort nur statische methoden, aber kein singleton
                        apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

                        Kommentar


                        • #13
                          Zitat von BlackScorp Beitrag anzeigen
                          einfach aus dem grund, weil ich zu spät erfahren habe , dass man im spl_autoload_register ein array mit klassenname und methodenname übergeben kann im grunde spielt es ja keine rolle , zz reicht für mich eine autoload funktion völlig aus. Aber ist denn meine Autoload klasse eine Singleton variante? ich sehe dort nur statische methoden, aber kein singleton
                          Ist OK, hat mich nur mal interessiert warum einen Autoloader mit SingleTon behaften.

                          Gruß Litter
                          Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
                          [URL]http://www.lit-web.de[/URL]

                          Kommentar


                          • #14
                            hm.. also ich dachte Singleton wäre das gedöns mit Selfinstance und __clone und dass man in der Klasse selbst eine Instanz der klasse anlegt..
                            apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

                            Kommentar


                            • #15
                              http://de.wikipedia.org/wiki/Singlet...wurfsmuster%29

                              Deine Klasse hast du eindeutig nicht nach diesem Muster entworfen, da du beliebig viele Instanzen der Klasse erzeugen kannst.
                              [URL]http://hallophp.de[/URL]

                              Kommentar

                              Lädt...
                              X