Espacios de nombres PHP y "uso"

120

Tengo un pequeño problema con los espacios de nombres y las usedeclaraciones.

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

Estoy tratando de hacer esto usando rutas relativas, así que puse esto en todas las clases:

namespace Shape; 

En mi clase circular tengo lo siguiente:

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

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

class Circle extends Shape implements ShapeInterface{ ....

Si utilizo las includedeclaraciones, no obtengo errores. Si pruebo las usedeclaraciones obtengo:

Error fatal: la clase 'Shape \ Shape' no se encuentra en /Users/shawn/Documents/work/sites/workspace/shape/Circle.php en la línea 8

¿Podría alguien darme una pequeña guía sobre el tema?

Shawn Northrop
fuente
También con respecto a este tema - stackoverflow.com/questions/33341955/…
Peter

Respuestas:

169

El useoperador sirve para dar alias a nombres de clases, interfaces u otros espacios de nombres. La mayoría de las usedeclaraciones se refieren a un espacio de nombres o una clase que le gustaría 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 useoperador se utiliza con un nombre de clase o interfaz, 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;

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

cmbuckley
fuente
Entonces, si creo otro archivo llamado bootstrap.php y coloco un autocargador dentro junto con $ circle = new Circle (); Incluye Circle.php pero recibo un error: Error fatal: la clase 'Shape' no se encuentra en ... / Circle.php en la línea 6. Parece cargar Circle.php pero no cargar Shape.php El círculo está definido como: clase Circle extiende Shape implementa ShapeInterface
Shawn Northrop
Si elimino el espacio de nombres de las clases anteriores, el autocargador funciona bien. Sin embargo, cuando tengo un espacio de nombres en la interfaz de la clase de forma, aparece el error anterior
Shawn Northrop
1
Creé una esencia para dar un ejemplo. Desafortunadamente, los gists no pueden tener subcarpetas. Coloque bootstrap.php en una carpeta y coloque las otras clases en una subcarpeta llamada 'Forma'.
cmbuckley
13

Si necesita ordenar su código en espacios de nombres, simplemente use la palabra clave namespace:

file1.php

namespace foo\bar;

En file2.php

$obj = new \foo\bar\myObj();

También puede utilizar use. Si en el archivo2 pones

use foo\bar as mypath;

debe usar en mypathlugar de baren cualquier lugar del archivo:

$obj  = new mypath\myObj();

El uso use foo\bar;es igual a use foo\bar as bar;.

Charlie
fuente