Objota O mundo orientado a objetos

Como usar NameSpace no php

Posted on abril 12, 2011

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

Posted by Rodrigo Ireno

Comentários (7) Trackbacks (0)
  1. Otimo post Rodrigo !!!!
    Realmente mto necessário

  2. Muito legal essa sua dica Rodrigo!
    Estou tentando usar isso no meu projeto, mas estou com um probleminha. Neste caso, necessariamente o nome dos arquivos tem que ser iguais ao nome das classes.
    No meu caso, estou usando MVC e minha estrutura está assim:
    \control
    \user
    user.controller.php
    controller.php
    \model
    \user
    user.model.php
    database.php
    \view
    \user
    user.view.php
    view.php
    Porém minhas classes não usao o “.”, por exemplo minha user.view.php é UserView e por aí vai. Estou tentando resolver isso aqui, mas você sugere alguma coisa para meu caso?

    • Neste artigo:
      http://objota.com.br/web/php/utilizando-config-para-carregar-suas-classes.html

      tem uma boa explicação de como carregar suas classes. Neste caso o nome do arquivo deve ser igual ao nome da classe, ex:

      minha classe:
      class Objota{

      }

      nome do arquivo de minha classe deve ser:
      Objota.php (por exemplo);

      pois quando eu recuperar o nome da classe pela função mágica spl_autoload_register ou __autoload pederei então concatenar o nome sem problemas, para então, fazer o include da classe no meu arquivo atual.

      ex:

      __autoload($nome){

      // se eu der um \\ new Objota();
      // a variavel nome vai conter “Objota”

      include_once( $nome . “.php” );

      }

  3. Pedro, gostaria de saber se vc me passa seu contato, queria trocar uma idéia contigo!

  4. Gostaria de sabe como usar namescape com extends de classes.

  5. Uma dúvida, no arquivo config.php na linha “spl_autoload_register(function ($class)”, de onde vem os valores que carregam a variável $class? não vi ela ser setada em outro lugar nos arquivos


Leave a comment

Sem trackbacks