2012-05-10 22 views
82

Tengo un pequeño problema con los espacios de nombres y las instrucciones use.Espacios de nombres PHP y "use"

Tengo tres archivos: ShapeInterface.php, Shape.php y Circle.php.

que estoy tratando de hacer esto utilizando rutas relativas por lo que he puesto esto en todas las clases:

namespace Shape; 

En mi clase de círculo Tengo el siguiente:

namespace Shape; 
//use Shape; 
//use ShapeInterface; 

include 'Shape.php'; 
include 'ShapeInterface.php';  

class Circle extends Shape implements ShapeInterface{ .... 

Si uso las declaraciones include no obtengo ningún error. Si trato de las declaraciones use me sale:

Fatal error: Class 'Shape\Shape' not found in /Users/shawn/Documents/work/sites/workspace/shape/Circle.php on line 8

Podría alguien por favor, dame un poco de orientación sobre el tema?

+0

leí esto y todavía no lo entiendo muy bien. ¿Se incluirán los archivos externos con el uso? –

+0

También relacionado con este tema: http: // stackoverflow.com/questions/33341955/does-the-import-or-use-order-affect-functional-in-php – Peter

Respuesta

124

El use operator es para dar alias a nombres de clases, interfaces u otros espacios de nombres. La mayoría de use afirmaciones se refieren a un espacio de nombres o clase que desea acortar:

use My\Full\Namespace; 

es equivalente a:

use My\Full\Namespace as Namespace; 
// Namespace\Foo is now shorthand for My\Full\Namespace\Foo 

Si el operador use se utiliza con un nombre de clase o interfaz, que tiene los siguientes usos:

// after this, "new DifferentName();" would instantiate a My\Full\Classname 
use My\Full\Classname as DifferentName; 

// global class - making "new ArrayObject()" and "new \ArrayObject()" equivalent 
use ArrayObject; 

use El operador no debe confundirse con autoloading. Una clase se carga automáticamente (anulando la necesidad de include) registrando un autocargador (por ejemplo, con spl_autoload_register). Es posible que desee leer PSR-4 para ver una implementación adecuada de autocargador.

+0

Impresionante, lo verificaré. ¡Gracias! –

+0

Así que si creo otro archivo llamado bootstrap.php y coloco un autocargador dentro junto con $ circle = new Circle(); Incluye Circle.php pero obtengo un error: Error fatal: Class 'Shape' no encontrado en .../Circle.php en la línea 6. Parece que carga Circle.php pero no carga Shape.php Circle está definido as: class Circle extends Shape implements ShapeInterface –

+0

Si elimino el espacio de nombres de las clases anteriores, el autocargador funciona bien. Sin embargo, cuando tengo el espacio de nombres en la interfaz de la clase de forma, obtengo el error anterior –

4

La forma más sencilla de ponerlo

Si necesita ordenar su código en los espacios de nombres, sólo tiene que utilizar la palabra clave namespace.

En file1.php namespace foo\bar;

En file2.php $obj = new foo\bar\myObj();


Todavía un poco más en esta historia - la palabra clave use.

Si dice en el archivo2 use foo\bar as mypath, esto significa que necesita utilizar mypath en lugar de foo\bar en cualquier lugar del archivo. '

$obj = new mypath\myObj(); 

Si había dicho use foo\bar es igual a use foo\bar as bar