+6

PHP 5.3 parte 1: Namespaces

criado por Douglas V. Pasqua em 08/12/2009 6:38pm
Global Space

Sem a definição de namespace, todas as classes e funções pertencem ao espaço global . Funciona da mesma maneira que as antigas versões do php onde ainda não existiam namespaces.

Vamos criar uma nova classe User, desta vez pertencendo ao espaço global. Perceba que não definimos nenhuma namespace. Isto significa que a classe pertence ao espaço global.

Arquivo User.php, “global space”:
<?php
class User {
   private $name;

   public function setName ($username) {
     $this->name = $username;
   }

   public function getName() {
     return "The username in Global is " . $this->name;
   }

}

Para chamarmos um nome que esta no espaço global, devemos colocar o prefixo “\” no nome, ou simplesmente chamar o nome diretamente caso não exista nomes iguais no namespace corrente.

Vamos alterar mais uma vez o arquivo TesteNamespace.php onde vamos adicionar a chamada para a classe User que esta no espaço global.

TesteNamespace.php:
...
require_once("User.php"); // incluir classe global
...
print PHP_EOL;
$user3 = new \User(); // chamando a classe "User" no espaço global.
$user3->setName("Douglas");
print $user3->getName();
...

A nova saída após a execução do arquivo TesteNamespace.php:
The username in Blog is Douglas
The username in CMS is Douglas
The username in Global is Douglas

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 (~13 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 (~13 anos atrás)

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


abraços
02/11/2010 4:36pm (~13 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 (~14 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 (~14 anos atrás)

Novo Comentário:

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