Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Include_Path Linux & Autoloader

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Include_Path Linux & Autoloader

    Gruß,

    ich habe eine kleine Autoloader-Klasse die via include_path die dazugehörigen Dateien lädt.

    Unter Windows 7 (phph 5.3.3 / apache 2.2.16 ) klappt das auch wunderbar,nur unter Linux(Linux eddie 2.6.24-22 / PHP Version 5.2.4-2ubuntu5.9 /apache 2.x) nicht.

    PHP-Code:
    <?php

    class Autoloader {

      public static 
    $instance;

      public static function 
    init() {
        if (
    self::$instance == NULL)
          
    self::$instance = new self();

        return 
    self::$instance;
      }

      public function 
    __construct() {
        
    spl_autoload_register(array('Autoloader''autoload'), $class);
        
    spl_autoload_extensions('.php');

        
    set_include_path(get_include_path() . PATH_SEPARATOR MANAGERS);
        
    set_include_path(get_include_path() . PATH_SEPARATOR INCLUDES);

        
    //PEAR directory
        
    set_include_path(get_include_path() . PATH_SEPARATOR INCLUDES '/PEAR');

        
    //Open ID library
        
    set_include_path(get_include_path() . PATH_SEPARATOR BASE '/lib/openid');
      }

      public function 
    autoload($class) {
        
    spl_autoload($class);
      }

      
    //special method for modul loads
      
    public static function loadModul($dir$class null) {
        
    //split directories and classname
        
    $dirs array_reverse(explode('/'$dir));
        
    $file $dirs[0];
        
    $dirs[0] = strtolower($dirs[0]);

        
    //if class is emtpy, filename becomes classname
        
    $class $class $class $file;
       
          
    set_include_path(get_include_path() . PATH_SEPARATOR MODULES implode('/'$dirs));
          require_once(
    $file '.php');
          return new 
    $class;
        }
      }

    }

    ?>
    Auszug aus dem Include-Path:

    Linux:
    .
    :/usr/share/php
    :/usr/share/pear
    :/xxx/www/xxx/htdocs/v1/trunk/htdocs/includes/managers
    :/xxx/www/xxx/htdocs/v1/trunk/htdocs/includes
    :/xxx/www/xxx/htdocs/v1/trunk/htdocs/includes/PEAR
    :/xxx/www/xxx/htdocs/v1/trunk/htdocs/lib/openid
    :/xxx/www/xxx/htdocs/v1/trunk/htdocs/modules/admin

    Windows:
    .
    ;C:\php5\pear
    ;D:/xxx/xxx/htdocs/includes/managers
    ;D:/xxx/xxx/htdocs/includes
    ;D:/xxx/xxx/htdocs/includes/PEAR
    ;D:/xxx/xxx/htdocs/lib/openid
    ;D:/xxx/xxx/htdocs/modules/admin

    Die dort angegebenen Verzeichnisse befinden sich auch all dort, jedoch bekomme ich unter Linux trotzdem : "Fatal error: Class 'Core' not found in /xxx/www/xxx/htdocs/v1/trunk/htdocs/index.php on line 29"

    Die Core.php befindet sich im "/xxx/www/xxx/htdocs/v1/trunk/htdocs/includes" bzw. "D:/xxx/xxx/htdocs/includes" und müsste ja eigentlich gefunden werden.
    Da es unter Windows funktioniert ,kann ich eigentlich "normale" Programmierfehler ausschließen und auf Case-Sensitive(unter Linux) wurde geachtet.

    Ich hoffe das es verständlich ist und schonmal ein Danke im voraus.

  • #2
    Da es unter Windows funktioniert ,kann ich eigentlich "normale" Programmierfehler ausschließen und auf Case-Sensitive(unter Linux) wurde geachtet.
    Nicht genug. Aus der spl_autoload Doku:

    By default it checks all include paths to contain filenames built up by the lowercase class name appended by the filename extensions .inc and .php.
    Nachtrag:

    PHP-Code:
        spl_autoload_register(array('Autoloader''autoload'), $class); 
    ist übrigens sinnfrei. Erstmal ist $class nicht definiert und der zweite Parameter von spl_autoload_register sollte boolean sein. Weiterhin macht Autoloader::autoload hier nichts anderes als die default-Implementierung aufzurufen, es würde also genügen:

    PHP-Code:
    spl_autoload_register(); 
    Dann siehst du auch, dass deine sogenannte Autoloader-Klasse eigentlich nichts anderes tut als include-Pfade zu setzen. Vielleicht ein Grund, das Klassendesign mal zu überdenken.
    [IMG]https://g.twimg.com/twitter-bird-16x16.png[/IMG][URL="https://twitter.com/fschmengler"]@fschmengler[/URL] - [IMG]https://i.stack.imgur.com/qh235.png[/IMG][URL="https://stackoverflow.com/users/664108/fschmengler"]@fschmengler[/URL] - [IMG]http://i.imgur.com/ZEqflLv.png[/IMG] [URL="https://github.com/schmengler/"]@schmengler[/URL]
    [URL="http://www.schmengler-se.de/"]PHP Blog[/URL] - [URL="http://www.schmengler-se.de/magento-entwicklung/"]Magento Entwicklung[/URL] - [URL="http://www.css3d.net/"]CSS Ribbon Generator[/URL]

    Kommentar


    • #3
      Danke,es war wie von dir geschrieben das "default lowercase".

      Zum Nachtrag : Stimmt auch, nur wäre ohnehin nicht so gelieben.

      Dann siehst du auch, dass deine sogenannte Autoloader-Klasse eigentlich nichts anderes tut als include-Pfade zu setzen. Vielleicht ein Grund, das Klassendesign mal zu überdenken.
      Sie macht mehr und tut das was sie soll: Klassen laden wenn sie gebraucht werden.

      Kommentar

      Lädt...
      X