Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá, bom dia.
Primeiramente eu queria saber se vcs aconselham a utilização do namespace?
Eu utilizo muitos includes nos meus códigos e um amigo me aconselhou usar namespace.
Bom tenho uma dúvida.
Tenho uma classe Conexao na raiz do meu arquivo.
Eu quero utilizar essa classe Conexao em outro arquivo que está em um diretório acima.
Eu defini a classe Conexao assim:
<?php
namespace conectBD;
class Conexao {
...
...
}
Estando em um diretório acima, como eu faço para usar a classe Conexao?
include('../Conexão.php'); // Modo antico
use conectBD; // << Minha divida
$db = new Conexao();
Obrigado desde já.
Muito interessante a function __autoload, o link que vc me passou são dos padrões utilizá-la?
Sim, descreve a forma correta de utilizar os namespaces para o uso do autoload.
Legal, vou me informar melhor sobre padrões de utilização, mas tentei fazer rs.
Criei um diretório chamado Classe e o __autoload carrega as classes que estão dentro desse diretório.
<?php
function __autoload($classname){
if ($lastnspos = strripos($classname, '\\')) {
$classname = substr($classname, $lastnspos + 1);
}
$classname = 'classe/' . $classname . '.php';
if( file_exists($classname) ) {
//echo ' >'.$classname; //Visualizar os arquivos carregados
include_once $classname;
}
}
Sobre minha duvida, com a sua explicação eu consegui resolver.
<?php
include_once __DIR__.'/autoload.php';
use conectBD\Conexao as DB; // Conexao é o nome da classe
$db = new DB();
Muito obrigado pela atenção e se possível comente sobre a função __autoload que eu fiz.
Valeu!!!
Então, utilizando o __autoload do composer, ele já lhe entrega uma função de autoload. Por isso você não precisa se preocupar com nada.
Sobre a sua, é funcional quando todos os namespaces estiverem dentro da pasta "classe".
O namespace é útil para separar em pacotes e, também, substituir o uso do include.
É importante saber como é o padrão a ser utilizado: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md
Também entender o que são pacotes/packages: http://forum.imasters.com.br/topic/448099-resolvidonamespace/?p=1772073
Já quanto a sua dúvida, o uso da keyword use serve para importar um namespace e/ou adicionar um alias/apelido.
No seu caso, poderia ser utilizado da seguinte forma:
Sem import:
$db = new conectBD\Conexao(); <-- chamada do namespace global
Com import:
use conectBD\Conexao;// <- import de um namespace
$db = new Conexao();
Com alias:
use conectBD\Conexao as DB;// <- Uso de alias/apelido
$db = new DB();
E, dentro de outro namespace, deve-se utilizar a \ (contra-barra) no início do namespace, para indicar o caminho global e não relativo:
namespace Foo\Bar;
$db = new \conectBD\Conexao();// <- veja o uso de contra-barra no início do namespace
Ou
namespace Foo\Bar;
use \conectBD\Conexao;// <- veja o uso de contra-barra no início do namespace
$db = new Conexao();
Tudo que não estiver dentro de um namespace, considera-se dentro do namespace global.
Também pode ser simulado dessa forma:
namespace Foo\Bar {
/ códigos do namespace Foo\Bar /
}
namespace {
/ códigos do namespace global /
}
Só para esclarecer uma coisa, isso:
use Foo\Bar\Namespace;
Internamente, pelo PHP, é igual a isso:
use \Foo\Bar\Namespace as Namespace;
Por isso, sua conexão só funcionará assim:
include('../Conexão.php'); // Modo antico
use conectBD; // << Minha divida
$db = new conectBD\Conexao();
ou
include('../Conexão.php'); // Modo antico
$db = new \conectBD\Conexao();