Eu tenho um arquivo com uma classe Resp
. O caminho é:
C:\xampp\htdocs\One\Classes\Resp.php
E eu tenho um index.php
arquivo neste diretório:
C:\xampp\htdocs\Two\Http\index.php
Neste index.php
arquivo, quero instanciar uma classe Resp
.
$a = new Resp();
Eu sei que posso usar require
ou include
palavras-chave para incluir o arquivo em uma classe:
require("One\Classes\Resp.php"); // I've set the include_path correctly already ";C:\xampp\htdocs". It works.
$a = new Resp();
Mas quero importar classes sem usar require
ou include
. Estou tentando entender como a use
palavra-chave funciona. Eu tentei essas etapas, mas nada funciona:
use One\Classes\Resp;
use xampp\htdocs\One\Classes\Resp;
use htdocs\One\Classes\Resp;
use One\Classes;
use htdocs\One\Classes; /* nothing works */
$a = new Resp();
Diz:
Fatal error: Class 'One\Classes\Resp' not found in C:\xampp\htdocs\Two\Http\index.php
Como a palavra-chave use
funciona? Posso usá-lo para importar classes?
namespace
s. De fato, não existe nenhum Symfony se você não usa espaços para nomeRespostas:
use
não inclui nada. Apenas importa o namespace (ou classe) especificado para o escopo atualSe você deseja que as aulas sejam carregadas automaticamente - leia sobre o carregamento automático
fonte
Não, você não pode importar uma classe com a
use
palavra - chave. Você tem que usarinclude
/require
declaração. Mesmo se você usar um carregador auto PHP, ainda autoloader terá que usarinclude
ourequire
internamente.A palavra-chave Objetivo do uso :
Considere um caso em que você tem duas classes com o mesmo nome; você achará estranho, mas quando estiver trabalhando com uma grande estrutura MVC, isso acontece. Portanto, se você tiver duas classes com o mesmo nome, coloque-as em espaços para nome diferentes. Agora considere quando o seu carregador automático está carregando as duas classes (faz por
require
) e você está prestes a usar o objeto da classe. Nesse caso, o compilador ficará confuso sobre qual objeto de classe carregar entre dois. Para ajudar o compilador a tomar uma decisão, você pode usar ause
instrução para que ele possa tomar uma decisão na qual será usada.Atualmente, as principais estruturas usam
include
ourequire
viacomposer
epsr
1) compositor
2) Carregador automático PSR-4
Passar por eles pode ajudá-lo ainda mais. Você também pode usar um alias para abordar uma classe exata. Suponha que você tenha duas classes com o mesmo nome, digamos,
Mailer
com dois namespaces diferentes:e
E se você quiser usar as duas classes Mailer ao mesmo tempo, poderá usar um alias.
Posteriormente no seu código, se você quiser acessar esses objetos de classe, poderá fazer o seguinte:
Ele fará referência à classe original.
Alguns podem ficar confusos com o fato de que, então, não há nomes de classes semelhantes, então não há uso de
use
palavras-chave. Bem, você pode usar a__autoload($class)
função que será chamada automaticamente quando ause
instrução for executada com a classe a ser usada como argumento e isso pode ajudá-lo a carregar a classe no tempo de execução em tempo real, conforme necessário.Consulte esta resposta para saber mais sobre o carregador automático de classes.
fonte
use
instrução way dirá ao compilador carregar isso para mim agora. Entendi querido!Não pense demais sobre o que é um espaço para nome .
O espaço para nome é basicamente apenas um prefixo de classe (como o diretório no sistema operacional) para garantir a exclusividade do caminho da classe .
Além disso, para esclarecer as coisas, a instrução use não está fazendo nada apenas com alias nos seus Namespaces, para que você possa usar atalhos ou incluir Classes com o mesmo nome, mas com Namespace diferente no mesmo arquivo.
Por exemplo:
Se você quiser saber como os namespaces do PHP e o carregamento automático (tanto da maneira antiga quanto da nova com o Composer) funcionam, você pode ler a postagem do blog que acabei de escrever sobre este tópico: https://enterprise-level-php.com/ 2017/12/25 / the-magic-behind-autoloading-php-files-using-compositer.html
fonte
Você precisará incluir / exigir a classe de qualquer maneira, caso contrário, o PHP não saberá sobre o espaço para nome.
Você não precisa fazê-lo no mesmo arquivo. Você pode fazer isso em um arquivo de inicialização, por exemplo. (ou use um carregador automático, mas esse não é o assunto)
fonte
O problema é provavelmente o de que você precisará usar um carregador automático que pegue o nome da classe (neste caso, use '\') e mapeie-o para uma estrutura de diretórios.
Você pode conferir este artigo sobre a funcionalidade de carregamento automático do PHP. Já existem muitas implementações desse tipo de funcionalidade em estruturas.
Na verdade, eu implementei um antes. Aqui está um link .
fonte
Concordo com o Green, o Symfony precisa de espaço para nome, então por que não usá-lo?
É assim que uma classe de controlador de exemplo é iniciada:
fonte
Você não pode fazer isso além dos exemplos acima. Você também pode usar a palavra-chave
use
dentro de classes para importar características , desta forma:fonte
A
use
palavra-chave é para alias no PHP e não importa as classes. Isso realmente ajuda1) Quando você tem classes com o mesmo nome em diferentes espaços para nome
2) Evite usar um nome muito longo de classe repetidamente.
fonte
O espaço para nome é usado para definir o caminho para um arquivo específico que contém uma classe, por exemplo
Você pode incluir essa classe específica em outro arquivo php usando a palavra-chave "use", assim:
NOTA: Não use o caminho para o arquivo que contém a classe a ser implementada; o uso prolongado é usado para instanciar um objeto, mas somente o espaço para nome.
fonte
Usar a palavra-chave "use" é para encurtar literais de namespace. Você pode usar ambos com alias e sem ele. Sem alias, você deve usar a última parte do espaço para nome completo.
fonte