Um dos principais problemas em projetos WEB muitas vezes é o tempo gasto apenas fazendo includes de arquivos de códigos (no caso da aplicação sendo dividida em arquivos...boas práticas de programação).
O PHP disponibiliza um método "mágico" chamado "__autoLoad" que faz esta tarefa, logo o mesmo deve ser incluído no início do seu arquivo ".php". Desta maneira durante a execução do seu script, toda vez que for feita uma referência para um dado que esteja em outro arquivo PHP, o próprio irá incluí-lo.
Para que isto seja possível, é necessário que o "método mágico" seja implementado (sobrescrito), desta maneira você apenas precisa definir os diretórios onde os arquivos que serão incluídos estarão e possíveis prefixos e sufixos nos nomes dos arquivos.
Neste exemplo, fiz o uso de boas práticas de programação e fiz um arquivo serapado para implementar a função, no caso o "RequireManager.class.php", a sua implementação segue abaixo:
<?php
/**
* Classe utilitária para fazer a inclusão automática e
* genérica dos arquivos PHP por demanda de uso.
*
* Esta classe utiliza a função 'mágica' do PHP (__autoload) para
* fazer uma espécie de gatilho para incluir os arquivos 'classes'
* conforme são chamados pela aplicação.
*
* @author Carlos Alberto Junior( Este endereço de e-mail está protegido contra spambots. Você deve habilitar o JavaScript para visualizá-lo. )
*/
function __autoload($class)
{
$ref = new ReflectionClass('JConfiguration');
$metodos = $ref->getMethods();
$sufix = ".class.php";
$class = str_replace('_', '', $class);
// Percorre todos os métodos estáticos da classe JConfiguration.
foreach ($metodos as $metodo)
{
$dir = $metodo->invoke(null);
if(file_exists($dir.$class.$sufix))
{
require_once($dir.$class.$sufix);
}
}
}
?>
Depois que a função foi implementada, agora nos basta apenas incluir este arquivo no ponto da aplicação onde podem ocorrer "inclusões" de arquivos externos ao corrente, como por exemplo no index.php.
<?php
require_once("../JConfiguration.class.php");
require_once("../util/RequireManager.class.php");
# Includes que não irei precisar fazer porque na classe
#RequireManager incluída acima faz automaticamente
/*
require_once("classes/Endereco.class.php");
require_once("classes/Cliente.class.php");
require_once("classes/TipoCliente.class.php");
*/
try {
$con = mysql_connect('localhost', 'root', '123');
$banco = mysql_select_db('exemplo_oo', $con);
$cliente = new Cliente();
$cliente->set_id_cliente('');
$cliente->set_cpf('123.465.789-09');
$cliente->set_doc_identidade('000.000.00-0');
$cliente->set_nome('Joaquim da Silva');
$e = new Endereco();
$e->set_bairro('Nome Bairro');
$e->set_cidade('Dom Pedro X');
$e->set_descricao('Rua exemplo rua');
$e->set_id_endereco('');
$cliente->set_id_endereco($e);
$tipo = new Tipo_Cliente();
$tipo->set_descricao('Fisico');
$tipo->set_status ('A');
$tipo->set_id_tipo_cliente('');
$cliente->set_id_tipo_cliente($tipo);
$session = new Session();
$session->persist($cliente);
}
catch (Exception $e)
{
print 'Erro:'.$e->getMessage();
}
?>
Atenção! Neste arquivo PHP, o método __autoLoad faz a inclusão dos arquivos chamados pelo index.php, ou seja, que tiveram origem no arquivo PHP e não nos que foram incluídos automaticamente.
No caso por exemplo de no index.php seja incluído uma classe CategoriaDAO e dentro desta tenha uma classe ProdutoDAO, a classe ProdutoDAO não será incluida, para que a mesma seja incluída é necessário que você faça uma chamada ao arquivo "RequireManager.class.php" de dentro da sua classe CategoriaDAO.
Abraços e até a próxima.




