Jump to content
Sign in to follow this  
Higor Roberto

[Resolvido] namespace

Recommended Posts

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á.

Share this post


Link to post
Share on other sites

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();

Share this post


Link to post
Share on other sites

Sim, descreve a forma correta de utilizar os namespaces para o uso do autoload.

Share this post


Link to post
Share on other sites
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!!!

Share this post


Link to post
Share on other sites

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".

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Similar Content

    • By Diego-SLP
      Bom dia,
       
      Estou passando uma variavel via GET para uma pagina PHP e a SQL não interpreta a mesma.
       
      Se eu printar o numero é exibido, se eu colocar o valor manualmente na SQL ela funciona, porém quando coloco a variavel não exibe nenhum registro, se alguem puder me ajudar.
       
      <?php $id = $_GET['id']; echo $id; $procura = mysqli_query($con,"SELECT p.DATA,p.cod_func,f.nome,f.funcao,p.cod_etapa,p.entrada_1,p.saida_1,p.entrada_2,p.saida_2,p.entrada_3,p.saida_3 FROM rh_pontoFuncionario p, rh_funcionario f WHERE p.cod_func = f.cod AND p.cod_obra = '".$id."' ORDER BY p.id desc") or die (mysqli_error($procura)); while($row = mysqli_fetch_array($procura)){ ?> <tr role="row" class="odd table-sm"> <td class="text-center"> <?php echo date('d/m/Y',strtotime($row['DATA'])); ?> </td> <td class="text-center"><?php echo $row['cod_func'];?></td> <td class="text-center"><?php echo $row['nome'];?></td> <td class="text-center"><?php echo $row['funcao'];?></td> <td class="text-center"><?php echo $row['cod_etapa'];?></td> <td class="text-center"><?php echo $row['entrada_1'];?></td> <td class="text-center"><?php echo $row['saida_1'];?></td> <td class="text-center"><?php echo $row['entrada_2'];?></td> <td class="text-center"><?php echo $row['saida_2'];?></td> <td class="text-center"><?php echo $row['entrada_3'];?></td> <td class="text-center"><?php echo $row['saida_3'];?></td> <td class="project-actions text-center"> <a class="btn btn-warning btn-sm" href="#.php?id=<?php echo $row['id']; ?>"> <i class="fas fa-pencil-alt"> </i> </a> <a class="btn btn-danger btn-sm" href="#.php?id=<?php echo $row['id']; ?>"> <i class="fas fa-trash-alt"> </i> </a> </td> </tr> <?php }//while ?>  
    • By rodrigofv1994
      <?php $servername = "localhost"; $username = "root"; $password = ""; $dbname = "ajax";   $email = $_POST['email']; $senha = $_POST['senha'];   // Criando conexão $conn = new mysqli($servername, $username, $password, $dbname); // Checando conexão if ($conn->connect_error) {   die("Connection failed: " . $conn->connect_error); }   $sql = "select mail , senha from usuarios where mail = '$email' and senha = '$senha'";   $registros=$conn->count() //$registros = mysqli_num_rows($conn);   if($registros>0){     echo "1"; }else{     echo"0"; }   $conn->close(); ?>
    • By rodrigofv1994
      <?php $servername = "localhost"; $username = "root"; $password = ""; $dbname = "ajax";   $email = $_POST['email']; $senha = $_POST['senha'];   // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) {   die("Connection failed: " . $conn->connect_error); }   $sql = 'INSERT INTO usuarios VALUES (default,'$email','$senha')';   if ($conn->query($sql) === TRUE) {   echo "New record created successfully"; } else {   echo "Error: " . $sql . "<br>" . $conn->error; }   $conn->close(); ?>
    • By Camilavip
      Boa noite, alguém por acaso sabe um modo simples de se desativar um cadastro automaticamente após um período?
      Deixa eu explicar. Eu cadastro um cliente, em que na tabela do banco de dados tem o campo "ativo" onde 1 é ativado e 0 é desativado. Então eu queria cadastrar esse cliente e o ativar, mas que no período de 30 dias por exemplo ele se desativasse sozinho.  Alguém sa8e algo simples nesse sentido?
    • By Camilavip
      Boa noite a todos, estou tendo um probleminha em gravar a senha criptografada, na verdade editar, pois quando gravo vai certo, mas na edição não está dando certo.
      A baixo quando cadastro o cliente é assim, e está indo perfeito.
       
      $nome = $_POST['nome']; $email = $_POST['email']; $login = $_POST['login']; $senha = sha1($_POST['senha']); Mas na hora da edição como está um pouco diferente estou tentando colocar esse sha1 em todo lugar e não está dando
      nome='$_POST[nome]', email='$_POST[email]', login='$_POST[login]', senha='$_POST[senha]', Então no de cima no cadastro está ok, mas na edição não sei mais aonde coloco esse sha1 para dar certo ou é burrice minha mesmo,
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.