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

Utilizando spl_autoload_register

Posted on fevereiro 25, 2011

Posted by Rodrigo Ireno

Neste breve artigo quero mostrar como funciona a função spl_autoload_register que atua igualmente a  função __autoload. Neste caso o próprio nome já descreve em parte o que ela faz, pois esta função registra (ou empilha) mais conteúdo dentro de um escopo de autoload. Disse “escopo” e não função pois ela não pode ser utilizada junto com a função __autoload.

A grande vantagem de utilizar esta função é que você pode incluir módulos em seu sistema web sem se preocupar em incluir as classes deste módulo em seu class path. E utilizá-la é tão fácil quanto o autoload convencional.

Utilizando __autoload:

supondo que os arquivos Objota.class.php e Joao.class.php estão no mesmo diretório do arquivo index.php

Objota.class.php


<?php

class Objota{

 public function __construct(){
 echo "Incluiu Objota<br/>";
 }

}

?>

Joao.class.php


<?php

class Joao{

 public function __construct(){
 echo "Incluiu Joao<br/>";
 }

}

?>

index.php


<?php

function __autoload( $nomeDaClasse ){

 if(file_exists( $nomeDaClasse.".class.php"  )){
 include($nomeDaClasse.".class.php");
 }
 else{
 echo "Não foi possível carregar a classe";
 }

}

$obj = new Objota();

$o = new Joao();

?>

Utilizando a função spl_autoload_register:

Desta vez vamos supor que as classes Objota e Joao são de módulos completamente diferentes, por isso representei com nomes diferenciados., vejamos abaixo:

Objota.objota.class.php


<?php

class Objota{

 public function __construct(){
 echo "Incluiu Objota<br/>";
 }

}

?>

Joao.joao.class.php


<?php

class Joao{

 public function __construct(){
 echo "Incluiu Joao<br/>";
 }

}

?>

index.php


<?php

//funcao que carrega classes do modulo OBJOTA
function objota_carregar_classes( $nomeDaClasse ){

 if(file_exists( $nomeDaClasse.".objota.class.php"  )){
 include($nomeDaClasse.".objota.class.php");
 }

}
spl_autoload_register("objota_carregar_classes");

$obj = new Objota();

//funcao que carrega classes do modulo JOAO
function joao_carregar_classes( $nomeDaClasse ){

 if(file_exists( $nomeDaClasse.".joao.class.php"  )){
 include($nomeDaClasse.".joao.class.php");
 }

}

spl_autoload_register("joao_carregar_classes");

$jo = new Joao();

?>

Observação: A função spl_autoload_register sobrescreve a função autoload então se for adotar o uso desta, certifique-se de que nenhuma parte de seu sistema esteja usando o autoload convencional mas sim a spl_autoload_register.

Esta é uma solução, por exemplo, para a implantação do framework Smarty 3.0 ao seu sistema web. Pois ele utiliza esta função, e caso você não faça uso dela também, terá problemas.

Bom caros leitores este artigo (dica), fica por aqui. Caso haja dúvidas poste aí!