2012-02-23 14 views
12

Estoy aprendiendo sobre los espacios de nombres en PHP 5.3 y me gustaría usar Namespaces Autoloading. Encontré esto SplClassLoader class, pero no puedo entender cómo funciona.PHP carga automática con SplClassLoader?

Digamos que tengo estructura de directorios de la siguiente manera:

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

¿Cómo se activa la carga automática de clases? ¿Qué espacios de nombres deben tener request.php y response.php?

Este es el request.php:

namespace framework\http; 

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

y este es el response.php:

namespace framework\http; 

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

Y en index.php tengo:

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

$r = new Request(); 

me sale este mensaje de error:

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

¿Por qué no funciona? ¿Cómo puedo usar SplClassLoader en mis proyectos para que cargue/requiera mis clases, y cómo debo configurar y nombrar carpetas y espacios de nombres?

+0

Creo que los nombres de su archivo y directorio podrían necesitar comenzar con letras mayúsculas? –

+0

@Adrian Macneil: No en windows, pero tienes razón, esto debería hacerse. – hakre

Respuesta

11

Sus nombres de archivos y directorios necesitan para que coincida con el caso de las clases y espacios de nombres exactamente, como en el siguiente ejemplo:

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

Además, sólo es necesario declarar el espacio de nombres raíz cuando se registra el objeto SplClassLoader, de la siguiente manera:

<?php 

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

    use framework\http\Request; 

    $r = new Request(); 

?> 

Espero que esto ayude!

+3

Creo que 'use framework \ http \ Request;' es necesario antes de hacer referencia 'new Request()' ... a menos que me falta algo. –

+0

@MarkFox Editado para corregir. Gracias por el aviso. – rintaun

Cuestiones relacionadas