2010-07-06 20 views
8

Używam funkcji automatycznej obsługi SPL i wydaje mi się, że brakuje czegoś ważnego, ponieważ obecnie nie mogę go uruchomić. Oto fragment Obecnie używam:Używanie spl_autoload() nie może załadować klasy

// ROOT_DIRECTORY translates to /home/someuser/public_html/subdomains/test 
define('ROOT_DIRECTORY', realpath(dirname(__FILE__))); 
define('INCLUDE_DIRECTORY', ROOT_DIRECTORY . '/includes/classes/'); 
set_include_path(get_include_path() . PATH_SEPARATOR . INCLUDE_DIRECTORY); 
spl_autoload_extensions('.class.php, .interface.php, .abstract.php'); 
spl_autoload_register(); 

Kiedy echo get_include_path() zrobić uzyskać ścieżkę I spodziewanych:

// Output echo get_include_path(); 
.:/usr/lib/php:/usr/local/lib/php:/home/someuser/public_html/subdomains/test/includes/classes/ 

Jednak gdy uruchamiam kod wyświetla się następujący komunikat o błędzie:

Fatal error: spl_autoload() [function.spl-autoload]: Class Request could not be loaded in /home/someuser/public_html/subdomains/test/contact.php on line 5

Request.class.php to zdecydowanie w katalogu/home/someuser/public_html/subdomains/test/includes/classes /.

Czego mi brakuje?

+0

@Yannis Rizos - To jest rzeczywiście mój problem. Uczyń to jako odpowiedź, abym mógł zagłosować i dać ci kredyt za poprawną odpowiedź. –

Odpowiedz

19

Istnieje komentarz (anonimowy) pod adresem http://www.php.net/manual/en/function.spl-autoload-register.php#96804, który może dotyczyć Twojego problemu: spl_autoload_register() nie wydaje się grać dobrze z camelcase, aw twoim przypadku może próbować znaleźć request.class.php zamiast Request ...

+1

Znalazłem również ten błąd. Jak tylko zmieniłem nazwę klasy na małą, wszystko działało dobrze. Czy wiesz, czy został zgłoszony jako błąd? – AntonioCS

+2

Są otwarte na to błędy. Śmieszne, że to wciąż problem. Przeszedłem przez system błędów i głosowałem na odpowiednie, tutaj jest dobre miejsce na rozpoczęcie: https://bugs.php.net/bug.php?id=53065. – zombat

+1

Jeśli nadal chcesz używać spl, możesz użyć zamknięcia, które przeciąża domyślną funkcję, aby nie było napisane małymi literami: 'spl_autoload_register (function ($ class) { \t to klasa $. '.php'; }); '- dostroić swoje ścieżki;) –

0

Ścieżka, w której powinna znajdować się klasa, nie pasuje do ścieżki, której się spodziewałeś. Porównaj

.:/usr/lib/php:/usr/local/lib/php:/home/someuser/public_html/subdomains/test/includes/classes/ 

z

/home/someuser/public_html/subdomains/test/ 

Różnica polega na tym, że klasa nie jest w includes/classes/ jak Twój SPL wymaga jednak kilka katalogów powyżej.

0

Otrzymałem podobny komunikat o błędzie, ale mój problem był inny. Mój komunikat wyglądało

PHP Fatal error: spl_autoload(): Class Lib\Lib\Regex could not be loaded in /dir1/dir2/lib/regex.php on line 49 

Okazało się zapomniałem wyjąć Lib\ z Lib\Regex wewnątrz samej definicji klasy Regex. Miałem coś takiego:

namespace Lib; 

class Regex { 

... 

    public static function match($pattern, $str) { 

     $regex = new Lib\Regex($pattern); 

     ... 
    } 
} 
Powiązane problemy