Namespaces PHP e “uso”

120

Estou tendo alguns problemas com os namespaces e as useinstruções.

Eu tenho três arquivos: ShapeInterface.php, Shape.phpe Circle.php.

Estou tentando fazer isso usando caminhos relativos, então coloquei isso em todas as classes:

namespace Shape; 

Na minha classe de círculo, tenho o seguinte:

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

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

class Circle extends Shape implements ShapeInterface{ ....

Se eu usar as includedeclarações, não recebo erros. Se eu tentar as usedeclarações, obtenho:

Erro fatal: Classe 'Forma \ Forma' não encontrada em /Users/shawn/Documents/work/sites/workspace/shape/Circle.php na linha 8

Alguém poderia me dar uma pequena orientação sobre o assunto?

Shawn Northrop
fonte
Também sobre este assunto - stackoverflow.com/questions/33341955/…
Peter

Respostas:

169

O useoperador serve para atribuir aliases a nomes de classes, interfaces ou outros namespaces. A maioria das usedeclarações se refere a um namespace ou classe que você gostaria de encurtar:

use My\Full\Namespace;

é equivalente a:

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

Se o useoperador for usado com uma classe ou nome de interface, ele terá os seguintes 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;

O useoperador não deve ser confundido com carregamento automático . Uma classe é carregada automaticamente (negando a necessidade de include) registrando um carregador automático (por exemplo, com spl_autoload_register). Você pode querer ler PSR-4 para ver uma implementação de autoloader adequada.

cmbuckley
fonte
Portanto, se eu criar outro arquivo chamado bootstrap.php e colocar um autoloader dentro, juntamente com $ circle = new Circle (); Inclui o Circle.php, mas estou recebendo um erro: Erro fatal: Classe 'Forma' não encontrada em ... / Circle.php na linha 6. Parece carregar Circle.php, mas não carregar Shape.php Círculo está definido as: class Circle extends Shape implementa ShapeInterface
Shawn Northrop
Se eu remover o namespace das classes acima, o autoloader funcionará bem. No entanto, quando tenho namespace na interface da classe de forma, recebo o erro acima
Shawn Northrop
1
Criou uma essência para dar um exemplo. Infelizmente, os gists não podem ter subpastas. Coloque o bootstrap.php em uma pasta e coloque as outras classes em uma subpasta chamada 'Forma'.
cmbuckley
13

Se você precisar ordenar seu código em namespaces, basta usar a palavra namespace- chave :

file1.php

namespace foo\bar;

Em file2.php

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

Você também pode usar use. Se no arquivo 2 você colocar

use foo\bar as mypath;

você precisa usar em mypathvez de barqualquer lugar no arquivo:

$obj  = new mypath\myObj();

Usar use foo\bar;é igual a use foo\bar as bar;.

Charlie
fonte