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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<span class="pun"><?</span><span class="pln">php </span><span class="com">/** </span><span class="com"> * Classe utilitária para fazer a inclusão automática e </span><span class="com"> * genérica dos arquivos PHP por demanda de uso. </span><span class="com"> * </span><span class="com"> * Esta classe utiliza a função 'mágica' do PHP (__autoload) para </span><span class="com"> * fazer uma espécie de gatilho para incluir os arquivos 'classes' </span><span class="com"> * conforme são chamados pela aplicação. </span><span class="com"> * </span><span class="com"> * @author Carlos Alberto Junior(carlosjrcabello@gmail.com) </span><span class="com"> */</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> __autoload</span><span class="pun">(</span><span class="pln">$class</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pln"> $ref </span><span class="pun">=</span><span class="kwd">new</span><span class="typ">ReflectionClass</span><span class="pun">(</span><span class="str">'JConfiguration'</span><span class="pun">);</span><span class="pln"> </span><span class="pln"> $metodos </span><span class="pun">=</span><span class="pln"> $ref</span><span class="pun">-></span><span class="pln">getMethods</span><span class="pun">();</span><span class="pln"> </span><span class="pln"> </span><span class="pln"> $sufix </span><span class="pun">=</span><span class="str">".class.php"</span><span class="pun">;</span><span class="pln"> </span><span class="pln"> $class </span><span class="pun">=</span><span class="pln"> str_replace</span><span class="pun">(</span><span class="str">'_'</span><span class="pun">,</span><span class="str">''</span><span class="pun">,</span><span class="pln"> $class</span><span class="pun">);</span><span class="pln"> </span><span class="pln"> </span><span class="com">// Percorre todos os métodos estáticos da classe JConfiguration.</span><span class="pln"> </span><span class="kwd">foreach</span><span class="pun">(</span><span class="pln">$metodos </span><span class="kwd">as</span><span class="pln"> $metodo</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pln"> $dir </span><span class="pun">=</span><span class="pln"> $metodo</span><span class="pun">-></span><span class="pln">invoke</span><span class="pun">(</span><span class="kwd">null</span><span class="pun">);</span><span class="pln"> </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">file_exists</span><span class="pun">(</span><span class="pln">$dir</span><span class="pun">.</span><span class="pln">$class</span><span class="pun">.</span><span class="pln">$sufix</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pln"> require_once</span><span class="pun">(</span><span class="pln">$dir</span><span class="pun">.</span><span class="pln">$class</span><span class="pun">.</span><span class="pln">$sufix</span><span class="pun">);</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="pun">?></span><span class="pln"> </span> |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
<span class="pun"><?</span><span class="pln">php </span><span class="pln"> </span><span class="pln"> require_once</span><span class="pun">(</span><span class="str">"../JConfiguration.class.php"</span><span class="pun">);</span><span class="pln"> </span><span class="pln"> require_once</span><span class="pun">(</span><span class="str">"../util/RequireManager.class.php"</span><span class="pun">);</span><span class="pln"> </span><span class="com"># Includes que não irei precisar fazer porque na classe <span style="white-space: pre;"> </span> #RequireManager incluída acima faz automaticamente</span><span class="pln"><span style="white-space: pre;"> </span> /* </span><span class="pln"> <span style="color: #999999;">require_once</span></span><span class="pun"><span style="color: #999999;">(</span></span><span class="str"><span style="color: #999999;">"classes/Endereco.class.php"</span></span><span class="pun"><span style="color: #999999;">);</span></span><span class="pln"><span style="color: #999999;"> </span></span><span class="pln"><span style="color: #999999;"> require_once</span></span><span class="pun"><span style="color: #999999;">(</span></span><span class="str"><span style="color: #999999;">"classes/Cliente.class.php"</span></span><span class="pun"><span style="color: #999999;">);</span></span><span class="pln"><span style="color: #999999;"> </span></span><span class="pln"><span style="color: #999999;"> require_once</span></span><span class="pun"><span style="color: #999999;">(</span></span><span class="str"><span style="color: #999999;">"classes/TipoCliente.class.php"</span></span><span class="pun"><span style="color: #999999;">);</span></span><span class="pln"> </span><span class="pln"> */ </span><span class="kwd">try</span><span class="pun">{</span><span class="pln"> </span><span class="pln"> $con </span><span class="pun">=</span><span class="pln"> mysql_connect</span><span class="pun">(</span><span class="str">'localhost'</span><span class="pun">,</span><span class="str">'root'</span><span class="pun">,</span><span class="str">'123'</span><span class="pun">);</span><span class="pln"> </span><span class="pln"> $banco </span><span class="pun">=</span><span class="pln"> mysql_select_db</span><span class="pun">(</span><span class="str">'exemplo_oo'</span><span class="pun">,</span><span class="pln"> $con</span><span class="pun">);</span><span class="pln"> </span><span class="pln"> </span><span class="pln"> $cliente </span><span class="pun">=</span><span class="kwd">new</span><span class="typ">Cliente</span><span class="pun">();</span><span class="pln"> </span><span class="pln"> $cliente</span><span class="pun">-></span><span class="pln">set_id_cliente</span><span class="pun">(</span><span class="str">''</span><span class="pun">);</span><span class="pln"> </span><span class="pln"> $cliente</span><span class="pun">-></span><span class="pln">set_cpf</span><span class="pun">(</span><span class="str">'123.465.789-09'</span><span class="pun">);</span><span class="pln"> </span><span class="pln"> $cliente</span><span class="pun">-></span><span class="pln">set_doc_identidade</span><span class="pun">(</span><span class="str">'000.000.00-0'</span><span class="pun">);</span><span class="pln"> </span><span class="pln"> $cliente</span><span class="pun">-></span><span class="pln">set_nome</span><span class="pun">(</span><span class="str">'Joaquim da Silva'</span><span class="pun">);</span><span class="pln"> </span><span class="pln"> </span><span class="pln"> $e </span><span class="pun">=</span><span class="kwd">new</span><span class="typ">Endereco</span><span class="pun">();</span><span class="pln"> </span><span class="pln"> $e</span><span class="pun">-></span><span class="pln">set_bairro</span><span class="pun">(</span><span class="str">'Nome Bairro'</span><span class="pun">);</span><span class="pln"> </span><span class="pln"> $e</span><span class="pun">-></span><span class="pln">set_cidade</span><span class="pun">(</span><span class="str">'Dom Pedro X'</span><span class="pun">);</span><span class="pln"> </span><span class="pln"> $e</span><span class="pun">-></span><span class="pln">set_descricao</span><span class="pun">(</span><span class="str">'Rua exemplo rua'</span><span class="pun">);</span><span class="pln"> </span><span class="pln"> $e</span><span class="pun">-></span><span class="pln">set_id_endereco</span><span class="pun">(</span><span class="str">''</span><span class="pun">);</span><span class="pln"> </span><span class="pln"> </span><span class="pln"> $cliente</span><span class="pun">-></span><span class="pln">set_id_endereco</span><span class="pun">(</span><span class="pln">$e</span><span class="pun">);</span><span class="pln"> </span><span class="pln"> </span><span class="pln"> $tipo </span><span class="pun">=</span><span class="kwd">new</span><span class="pln"> Tipo_Cliente</span><span class="pun">();</span><span class="pln"> </span><span class="pln"> $tipo</span><span class="pun">-></span><span class="pln">set_descricao</span><span class="pun">(</span><span class="str">'Fisico'</span><span class="pun">);</span><span class="pln"> </span><span class="pln"> $tipo</span><span class="pun">-></span><span class="pln">set_status </span><span class="pun">(</span><span class="str">'A'</span><span class="pun">);</span><span class="pln"> </span><span class="pln"> $tipo</span><span class="pun">-></span><span class="pln">set_id_tipo_cliente</span><span class="pun">(</span><span class="str">''</span><span class="pun">);</span><span class="pln"> </span><span class="pln"> </span><span class="pln"> $cliente</span><span class="pun">-></span><span class="pln">set_id_tipo_cliente</span><span class="pun">(</span><span class="pln">$tipo</span><span class="pun">);</span><span class="pln"> </span><span class="pln"> </span><span class="pln"> $session </span><span class="pun">=</span><span class="kwd">new</span><span class="typ">Session</span><span class="pun">();</span><span class="pln"> </span><span class="pln"> $session</span><span class="pun">-></span><span class="pln">persist</span><span class="pun">(</span><span class="pln">$cliente</span><span class="pun">);</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pun">(</span><span class="typ">Exception</span><span class="pln"> $e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">print</span><span class="str">'Erro:'</span><span class="pun">.</span><span class="pln">$e</span><span class="pun">-></span><span class="pln">getMessage</span><span class="pun">();</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="pln"> </span><span class="pun">?></span><span class="pln"> </span> |
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.