Usando namespaces: Apelidando/Importando
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
A capacidade de se referir a um nome totalmente qualificado externo com um apelido, ou importação,
é um recurso importante dos namespaces. Isso é semelhante à
capacidade dos sistemas de arquivos baseados em Unix de criar links simbólicos para um arquivo ou diretório.
O PHP pode apelidar ou importar constantes, funções, classes, interfaces, traits, enums e namespaces.
A criação de apelidos é realizada com o operador use
.
Aqui está um exemplo mostrando todos os 5 tipos de importação:
Exemplo #1 Importanto ou apelidando com o operador use
<?php
namespace foo;
use Caminho\Completo\Classe as Outra;
// Isso é o mesmo que use Caminho\Completo\NomeNamespace as NomeNamespace
use Caminho\Completo\NomeNamespace;
// Importando uma classe global
use ArrayObject;
// Importando uma função
use function Caminho\Completo\nomeFuncao;
// Apelidando uma função
use function Caminho\Completo\nomeFuncao as funcao;
// Importando uma constante
use const Caminho\Completo\CONSTANTE;
$obj = new namespace\Outra; // Instancia um objeto da classe foo\Outra
$obj = new Outra; // Instancia um objeto da classe Caminho\Completo\Classe
NomeNamespace\SubNamespace\funcao(); // Chama a função Caminho\Completo\NomeNamespace\SubNamespace\funcao
$a = new ArrayObject(array(1)); // Instancia um objeto da classe ArrayObject
// Sem a declaração "use ArrayObject" teria sido instanciado um objeto da classe foo\ArrayObject
funcao(); // chama a função Caminho\Completo\nomeFuncao
echo CONSTANTE; // imprime o valor de Caminho\Completo\CONSTANTE
?>
Note que para nomes com namespaces (nomes de namespaces totalmente qualificados contendo
o separador de namespace, como
Foo\Bar
, em oposição a nomes globais sem
separadores, como
FooBar
), a barra invertida inicial não é necessária e não
é recomendada, pois nomes importados precisam
ser totalmente qualificados e não são processados em relação ao namespace atual.
O PHP também suporta um atalho de conveniência para colocar várias instruções use
na mesma linha.
Exemplo #2 Importando ou criando apelidos com várias declarações use combinadas
<?php
use Caminho\Completo\Classe as Outra, Caminho\Completo\NomeNamespace;
$obj = new Outra; // Instancia um objeto da classe Caminho\Completo\Classe
NomeNamespace\SubNamespace\funcao(); // Chama a função Caminho\Completo\NomeNamespace\SubNamespace\funcao
?>
A importação é realizada em tempo de compilação e por isso, não afeta classes, funções
ou nomes de constantes gerados dinamicamente.
Exemplo #3 Importação e nomes dinâmicos
<?php
use Caminho\Completo\Classe as Outra, Caminho\Completo\NomeNamespace;
$obj = new Outra; // Instancia um objeto da classe Caminho\Completo\Classe
$a = 'Outra';
$obj = new $a; // Instancia um objeto da classe Outra
?>
Além disso, a importação afeta apenas nomes não qualificados e qualificados. Nomes totalmente
qualificados são absolutos e não são afetados pelas importações.
Exemplo #4 Importação e nomes completamente qualificados
<?php
use Caminho\Completo\Classe as Outra, Caminho\Completo\NomeNamespace;
$obj = new Outra; // Instancia um objeto da classe Caminho\Completo\Classe
$obj = new \Outra; // Instancia um objeto da classe Outra
$obj = new Outra\Coisa; // Instancia um objeto da classe Caminho\Completo\Classe\Coisa
$obj = new \Outra\Coisa; // Instancia um objeto da classe Outra\Coisa
?>
Regras de escopo para importação
A palavra-chave use
precisa ser declarada no
escopo mais externo do arquivo (o escopo global) ou dentro de declarações
de namespaces. Isso ocorre por a importação ser realizada em tempo de
compilação e não em tempo de execução, portanto, não pode ter escopo de bloco. O exemplo
a seguir mostra um uso inválido da palavra-chave
use
:
Exemplo #5 Regra de importação inválida
<?php
namespace Linguas;
function paraGroenlandes()
{
use Linguas\Dinamarques;
// ...
}
?>
Nota:
As regras de importação são por arquivo, o que significa que os arquivos incluídos
NÃO herdarão as regras de importação do arquivo pai.
Declarações use
em grupo
Classes, funções e constantes importadas do
mesmo namespace
podem ser agrupadas numa única declaração
use
.