2010-05-19 9 views
11

Mam następujący kod php:nazw Autoload działa pod windows, ale nie na Linux

index.php

<?php 
spl_autoload_extensions(".php"); 
spl_autoload_register(); 

use modules\standard as std; 

$handler = new std\handler(); 
$handler->delegate(); 
?> 

moduły \ standardowego \ handler.php

<?php 
namespace modules\standard { 
    class handler { 
     function delegate(){ 
      echo 'Hello from delegation!'; 
     } 
    } 
} 
?> 

W systemie Windows 7, uruchomionym WAMP, kod generuje komunikat "Hello from Delegation!" jednak pod Linuksem, mam następujące:

Fatal error: spl_autoload(): Class modules\standard\handler could not be loaded in /var/www/index.php on line 15

uruchomiony jest system Windows PHP 5.3.0 pod WAMP i Linux jest uruchomiony pakiet 5.3.2 dotdeb pod Ubuntu 9.10.

Czy jest to kwestia konfiguracji na moim Linuksie, czy tylko różnica w sposobie nazw i autoloading jest obsługiwane na różnych systemach operacyjnych

+0

To nie jest przypadek, ale spl_autoload-register() tłumaczy nazwę klasy na małe litery, więc będzie łamać się na Uniksie, jeśli użyjesz nazw camelCase (https://bugs.php.net/bug.php?id = 53065) –

Odpowiedz

4

SPL autoloader jest bardzo prymitywny - nie ma wiedzy na temat nazw, tak próbuje załadować plik z \ in jego nazwą, podczas gdy w systemie Linux/Unix separatorem ścieżek jest/nie.

+0

Dzięki za głowy. Głupi PHP. Albo użyję __autoload() albo ugotuję coś własnego. – EvilChookie

2

Herman Radtke mówi, że złożyła poprawkę:

http://www.hermanradtke.com/blog/hidden-features-with-spl_autoload-and-namespaces/

: s

Mam nadzieję, że to będzie realizowane szybko.

Na razie używam tego rozwiązania:

<?php 
set_include_path('./classes/' . PATH_SEPARATOR . get_include_path()); 
spl_autoload_extensions('.php , .class.php'); 
spl_autoload_register(); 
function linux_namespaces_autoload ($class_name) 
    { 
     /* use if you need to lowercase first char * 
     $class_name = implode(DIRECTORY_SEPARATOR , array_map('lcfirst' , explode('\\' , $class_name)));/* else just use the following : */ 
     $class_name = implode(DIRECTORY_SEPARATOR , explode('\\' , $class_name)); 
     static $extensions = array(); 
     if (empty($extensions)) 
      { 
       $extensions = array_map('trim' , explode(',' , spl_autoload_extensions())); 
      } 
     static $include_paths = array(); 
     if (empty($include_paths)) 
      { 
       $include_paths = explode(PATH_SEPARATOR , get_include_path()); 
      } 
     foreach ($include_paths as $path) 
      { 
       $path .= (DIRECTORY_SEPARATOR !== $path[ strlen($path) - 1 ]) ? DIRECTORY_SEPARATOR : ''; 
       foreach ($extensions as $extension) 
        { 
         $file = $path . $class_name . $extension; 
         if (file_exists($file) && is_readable($file)) 
          { 
           require $file; 
           return; 
          } 
        } 
      } 
     throw new Exception(_('class ' . $class_name . ' could not be found.')); 
    } 
spl_autoload_register('linux_namespaces_autoload' , TRUE , FALSE); 
?> 
1
function __autoload($class_name) { 
$paths[] = dirname(__FILE__) . "/../libs/misc/"; 
$paths[] = dirname(__FILE__) . "/../../libs/misc/"; 
$paths[] = dirname(__FILE__) . "/../../libs/helpers/"; 
$paths[] = dirname(__FILE__) . "/../../libs/simpleimage/"; 

foreach($paths as $path) 
    { 
     if(file_exists($path.strtolower($class_name).'.class.php')){ 
     require_once($path.strtolower($class_name).'.class.php'); 
     } 
    } 
} 
1
function __autoload($class_name) 
{ 
    $class_name = strtolower(str_replace('\\', DIRECTORY_SEPARATOR, $class_name)); 

    include $class_name . '.php'; 
} 

srttolower jest potrzebne na Apache, ponieważ jest (w przeciwieństwie do IIS) Sprawa sentive.

0

Jest to typowy problem pojawiający się podczas automatycznego ładowania. Poprawka polega na użyciu stałej DIRECTORY_SEPARATOR w funkcji automatycznego ładowania.

Więc funkcja autoload będzie wyglądać po

<?php 

spl_autoload_register(function($className) { 

    $className = str_replace("\", DIRECTORY_SEPARATOR, $className); 
    include_once $_SERVER['DOCUMENT_ROOT'] . '/class/' . $className . '.php'; 

}); 

Jeśli chcesz dowiedzieć się więcej na temat nazw/ładowanej klasy wizyty here

Dzięki.

Powiązane problemy