2012-02-23 17 views
12

Uczyłem się o przestrzeniach nazw w PHP 5.3 i chciałbym używać Przestrzeni automatycznej. Znalazłem to SplClassLoader class, ale nie mogę zrozumieć, jak to działa.Automatyczne ładowanie PHP za pomocą SplClassLoader?

powiedzmy mam struktury katalogów takiego:

system 
    - framework 
    - http 
     - request.php 
     - response.php 
index.php 
SplClassLoader.php 

Jak włączyć automatyczne ładowanie klasy? Jakie przestrzenie nazw powinny mieć: request.php i response.php?

To request.php:

namespace framework\http; 

class Request 
{ 
    public function __construct() 
    { 
     echo __CLASS__ . " constructer!"; 
    } 
} 

I to jest response.php:

namespace framework\http; 

class Request 
{    
    public function __construct() 
    {  
     echo __CLASS__ . " constructed!";     
    }   
} 

I index.php mam:

require_once("SplClassLoader.php"); 
$loader = new SplClassLoader('framework\http', 'system/framework'); 
$loader->register(); 

$r = new Request(); 

otrzymuję komunikat o błędzie:

Fatal error: Class 'Request' not found in C:\wamp\apache\htdocs\php_autoloading\index.php on line 8 

Dlaczego to nie działa? Jak mogę używać SplClassLoader w moich projektach, aby ładować/wymagać moich zajęć i jak mam skonfigurować i nazwać foldery i przestrzenie nazw?

+0

Myślę, że Twoje nazwy plików i katalogów mogą wymagać wielkich liter? –

+0

@Adrian Macneil: Nie w Windows, ale masz rację, to powinno być zrobione. – hakre

Odpowiedz

11

Nazwy plików i katalogów trzeba dopasować przypadek swoimi klasami i nazw dokładnie, jak w poniższym przykładzie:

system 
    - framework 
    - http 
     - Request.php 
     - Response.php 
index.php 
SplClassLoader.php 

Dodatkowo, trzeba tylko zadeklarować nazw root podczas rejestracji obiektu SplClassLoader, w następujący sposób:

<?php 

    require_once("SplClassLoader.php"); 
    $loader = new SplClassLoader('framework', 'system/framework'); 
    $loader->register(); 

    use framework\http\Request; 

    $r = new Request(); 

?> 

Mam nadzieję, że to pomoże!

+3

Myślę, że 'use framework \ http \ Request;' jest potrzebne zanim odwołasz się do 'new Request()' ... chyba że czegoś mi brakuje. –

+0

@MarkFox Edytowane w celu naprawy. Dzięki za heads-up. – rintaun