+6

PHP 5.3 parte 1: Namespaces

criado por Douglas V. Pasqua em 08/12/2009 6:38pm
Multiplos namespaces em um mesmo arquivo

PHP permite que você defina mais de uma namespace em um mesmo arquivo. É possível mesclar código sem namespace com código com namespace. Ao utilizar mais de uma namespace em um mesmo arquivo é fortemente recomendável o uso de chaves “{“. Exemplo:

namespace Projeto\Secao1 {
// código inserido arqui estará no namespace Projeto\Secao1
    const USER_STATE = 1;
    function get_user_state() { ... }
    class UserState() { ... }
}

namespace Projeto\Secao2 {
// código inserido arqui estará no namespace Projeto\Secao2
    const USER_STATE = 1;
    function get_user_state() { ... }
    class UserState() { ... }
}

namespace {
// código inserido arqui estará no espaço global.
    const USER_STATE = 1;
    function get_user_state() { ... }
    class UserState() { ... }
}

Comentários:

Mostrando 1 - 5 de 5 comentários
Douglas,

Eu queria mesmo saber é como implementar um autoload para cada namespace, assim:

foo.php
<?php

namespace foo;

function __autoload($class); // carrega as classes apenas do namespace foo.

bar.php
<?php

namespace bar;

function __autoload($class); // carrega as classes apenas do namespace bar.


Eu sei que poderia ser usado o sql_autoload_register, mas isso já podia ser usado no PHP 5.2. Logo, ao meu ver, namespaces no PHP é meio inutil, uma vez que elas não definem padrões de autoload default como o Java ou Python.
08/11/2010 1:36pm (~14 anos atrás)

Olá Diego,

O autoload é uma forma de carregar os arquivos de suas classes php dinâmicamente, sem a necessidade de ter que ficar usando require_once para cada arquivo de classe que você necessita carregar.

Quando usado autoload com namespace, o caminho todo do namespace será passado para a função autoload. Exemplo:

$user = new \Cms\Usuario();

Será executada a função __autoload, com o parâmetro "\Cms\Usuario" . A partir daí é só usar essa informações para localizar o arquivo que deseja incluir! È necessário que você implemente a função __autoload.

03/11/2010 5:14pm (~14 anos atrás)

Vocês poderiam dar exemplos de autoload por namespace, achei essa parte muito confusa.


abraços
02/11/2010 4:36pm (~14 anos atrás)

Rubens, Obrigado pelo toque sobre o autoload. Realmente é um recurso muito importante. Quando usamos autoload para incluir as classes usadas na aplicação, com o uso de namespace, o nome full-qualifed é passado para a função __autoload. Por exemplo:

$user = new Project\Cms\User();

function __autoload($class_name) {
	require_once("lib/$class_name.php");
}

No exemplo anterior, ao instanciar a classe User, o valor da variável $class_name passada para a função __autoload será Project\Cms\User. Neste caso do exemplo todas as classes estão no diretório lib. Caso você adicione um código na função de __autoload para obter somente o nome da classe e incluí-la, removendo a parte do namespace da string, não poderemos ter dois arquivos com o mesmo nome no mesmo diretório. Portanto, a melhor coisa a fazer realmente é criar uma estrutura de diretórios correspondente à hierarquia usada no namespace. O path completo do arquivo contendo a classe User do exemplo anterior seria:

lib/Project/Cms/user.php

Falta agora modificar a função de __autoload() para converter a string de namespace para o path do arquivo contendo a classe.

function __autoload($class) { 
    // converter namepsace para path completa do arquivo
    $class = 'classes/' . str_replace('\\', '/', $class) . '.php'; 
    require_once($class);  
} 
12/12/2009 11:41am (~15 anos atrás)

Bacana o artigo, Douglas. Parabéns. Eu acho muito legal quando antecipam algumas funcionalidades previstas para o PHP 6, como o namespace.

Acho que só faltou um detalhe importante no seu artigo, que é o tratamento sobre o autoload de classes. Com namespace é possível definir qual autoload cuida de qual namespace. Também é possível organizar as classes em diretórios de forma semelhante à organização do namespace, assim fica fácil localizar uma classe na árvore de diretórios a partir do seu nome completo.
08/12/2009 7:38pm (~15 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)