PHP 5.3 parte 1: Namespaces
Muitos dos recursos previstos para a versão 6 do php foram incluídos na versão 5.3. Namespaces é uma delas. Namespaces vem para ajudar a evitar conflitos entre nome de funções, classes e constantes. Até a versão 5.2 muitas aplicações utilizavam prefixos nos nomes de classes e funções para evitar estes conflitos. Na aplicação de blog chamada wordpress, usa-se o prefixo “wp_” em nome dos elementos. Por exemplo o nome de algumas funções: wp_update_post, wp_create_user !
Com Namespaces você agrupa classes, funções e constante de forma que possa haver elementos com nomes iguais em diferentes “grupos” ou namespaces, funcionando sem conflitos. Dessa forma, pode-se diminuir a utilização de prefixos, deixando o código mais limpo.
Definindo Namespaces
Para definir um namespace com o nome de foo:
Vamos montar um ambiente de testes para entender melhor o funcionamento de namespaces. Segue a abaixo a declaração de duas classes com o mesmo nome, chamadas User, cada uma em um namespace diferente:
Arquivo UserBlog.php, namespace Blog:
Arquivo UserCms.php, namespace Cms:
Com Namespaces você agrupa classes, funções e constante de forma que possa haver elementos com nomes iguais em diferentes “grupos” ou namespaces, funcionando sem conflitos. Dessa forma, pode-se diminuir a utilização de prefixos, deixando o código mais limpo.
Definindo Namespaces
Para definir um namespace com o nome de foo:
<?php namespace foo;
Vamos montar um ambiente de testes para entender melhor o funcionamento de namespaces. Segue a abaixo a declaração de duas classes com o mesmo nome, chamadas User, cada uma em um namespace diferente:
Arquivo UserBlog.php, namespace Blog:
<?php
namespace Blog;
class User {
private $name;
public function setName ($username) {
$this->name = $username;
}
public function getName() {
return "The username in Blog is " . $this->name;
}
}
Arquivo UserCms.php, namespace Cms:
<?php
namespace Cms;
class User {
private $name;
public function setName ($username) {
$this->name = $username;
}
public function getName() {
return "The username in CMS is " . $this->name;
}
}
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.
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
(~8 meses atrás)


em 08/12/2009 6:38pm

disse:
$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); }