Objota O mundo orientado a objetos

Como usar NameSpace no php

Posted on abril 12, 2011

Posted by Rodrigo Ireno

O exemplo mais fácil para referenciar name space é a linguagem JAVA. Que usa o conceito de package e que no final das contas é a mesma coisa. O objetivo de usar este recurso é entre outras coisas organizar suas classes em grupos especializados.

No java se faz o uso de name space ao chamar um objeto diretamente ou método ou ao importar uma classe ou pacote de classes. exemplo:

import javax.swing.JOptionPane.*;

Este exemplo importa tudo o que está dentro do pacote JOptionPane.

Porém essa realidade (import) não se aplica ao php, pois utilizamos o autoload.

Vejamos abaixo uma pequena estrutura montada para utilizar este recurso no php. Implementei um config.php e uma página index.php. A primeira mudança que devemos notar é o modo como a função autoload está sendo implementada

obs: A versão do php que estou usando é 5.3.x

Seguem os arquivos da estrutura:

classes/Usuario.class.php

<?php
namespace classes;

class Usuario{

 function getIdade() {
 return 8;
 }
}

?>

classes/util/Conexao.class.php

<?php
namespace classes\util;

class Conexao{

 function getConnection() {
 return 'is connected!';
 }

}
?>

classes/util/Timer.class.php

<?php
namespace classes\util;

class Timer{

 function getNow(){
 echo "<br />".date("h:m:s")."<br />";
 }
}
?>

config.php

<?php
define("HOME", getEnv("DOCUMENT_ROOT")."/teste/");

spl_autoload_register(function ($class) {

 $nome = str_replace("\\", "/" , $class . '.class.php');

 if( file_exists( HOME . $nome ) ){
 include_once( HOME . $nome );
 }

});
?>

index.php

<?php
include_once("config.php");

use classes\Usuario;
use classes\util\Conexao;
use classes\util\Timer;

$usuario = new Usuario();
$con = new Conexao();
$timer = new Timer();

echo $con->getConnection() . "<br />";
echo $usuario->getIdade() . "<br />";

$timer->getNow();

?>

Note que ao utilizar namespace é obrigatório respeitar a organização dos diretórios. Caso contrário a sua função de autoload não irá funcionar. Em java a organização também é feita desta forma, porém as ferramentas IDE's abstraem um pouco essa parte. Mas como disse no final das contas um package ou namespace é literalmente isso separar em diretórios diferentes o seus arquivos php que contém classes.

Dê uma fuçada na função autoload printando na tela a classe atualmente sendo chamada, e verá que o nome que é recuperado pelo seu parâmetro não traz somente o nome (mas também todo o caminho do namespace especificado no arquivo da classe).

Bom, finalizo este post aqui, e espero que tenha esclarecido algumas dúvidas. valew 😉

arquivos (descompacte no seu htdocs):  download dos arquivos