2012-09-27 25 views
7

Digamos que he declarado un espacio de nombres como esto:¿Por qué tiene que incluir un archivo PHP al usar el espacio de nombres?

<?php 
// File kitchen.php 
namespace Kitchen; 
?> 

¿Por qué todavía tengo para incluir ese archivo en todos los demás archivos donde quiero utilizar kitchen.php
No PHP sabe que la cocina .php reside en el espacio de nombres de la cocina?

Gracias por responder.

+9

¡Espacios de nombres! = Carga automática. – Mahn

+1

¿Entonces el espacio de nombres es como el directorio virtual y la carga automática se usa para cargar archivos desde el directorio? ¿Puedes usar autocarga con espacio de nombres? ¡¡Gracias!! – intelis

+1

Lea aquí: http://php.net/manual/en/language.namespaces.rationale.php y aquí: http://php.net/manual/en/language.oop5.autoload.php; leer los documentos puede ser muy útil :) – Mahn

Respuesta

11

Los espacios de nombre facilitan la creación de autocargadores para cualquier clase dentro de su proyecto, ya que puede incluir directamente la ruta a la clase dentro de la llamada.

Un ejemplo de espacio de nombres de pseudo código.

<?php 
// Simple auto loader translate \rooms\classname() to ./rooms/classname.php 
spl_autoload_register(function($class) { 
    $class = str_replace('\\', '/', $class); 
    require_once('./' . $class . '.php'); 
}); 

// An example class that will load a new room class 
class rooms { 
    function report() 
    { 
     echo '<pre>' . print_r($this, true) . '</pre>'; 
    } 

    function add_room($type) 
    { 
     $class = "\\rooms\\" . $type; 
     $this->{$type} = new $class(); 
    } 
} 

$rooms = new rooms(); 
//Add some rooms/classes 
$rooms->add_room('bedroom'); 
$rooms->add_room('bathroom'); 
$rooms->add_room('kitchen'); 

Luego, dentro de la carpeta de ./rooms/ que tienen 3 archivos: bedroom.php bathroom.php kitchen.php

<?php 
namespace rooms; 

class kitchen { 
    function __construct() 
    { 
     $this->type = 'Kitchen'; 
    } 
    //Do something 
} 
?> 

A continuación informamos sobre las clases lo que las clases se cargan

<?php 
$rooms->report(); 
/* 
rooms Object 
(
    [bedroom] => rooms\bedroom Object 
     (
      [type] => Bedroom 
     ) 

    [bathroom] => rooms\bathroom Object 
     (
      [type] => Bathroom 
     ) 

    [kitchen] => rooms\kitchen Object 
     (
      [type] => Kitchen 
     ) 

) 
*/ 
?> 

creo que sirve

+3

Supongo que está preguntando por qué la carga lenta no está incorporada por defecto. – Pacerier

Cuestiones relacionadas