Objota O mundo orientado a objetos

Utilizando spl_autoload_register

Posted on fevereiro 25, 2011

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í!

Posted by Rodrigo Ireno

Comentários (5) Trackbacks (1)
  1. eu poderia criar um arquivo autoload.php contento as funcoes de carregamento de classe e spl_autoload_register e quando fosse utilizar por exemplo na index.php como no exemplo apenas dar o include autoload.php e começar a instanciar as classes?????

  2. Excelente, me ajudou baste.

    Funcionou exatamente como disse que funcionaria.
    A única coisa que fiz de diferente é que coloquei o nome da pasta onde as classes estão separadas dos demais arquivos do site.

    Ex. na linha que contem o file_exists e include ($nomeDaClasse.”.joao.class.php”) eu coloquei: (“nomeDaPasta/”.$nomeDaClasse.”.joao.class.php”).

    Muito Obrigado por compartilhar.

  3. Eu estava tendo problemas usando __autoload() e Smarty. Foi a solução, grande ajuda!

  4. Um exemplo simples e que não precisa registrar a classe todas as vezes que for instanciá-la seria:

    class ClassAutoLoader
    {
    public function __construct()
    {
    spl_autoload_register(array($this,’loader’));
    }

    private function loader($nameClass)
    {
    require_once __DIR__.”/usr/{$nameClass}.php”;
    }
    }

    Lembrando que este é um exemplo simples e sem tratamento algum.
    Imagine que esse código esteja num arquivo autoload.php, basta incluí-lo no seu index.php e instanciar a classe ClassAutoLoader. Depois disso é só sair instanciando suas demais classes


Leave a comment