terça-feira, 9 de novembro de 2010

autoloading

Hoje falarei um pouco sobre autoloading.
Mas o que vem a ser isso ?
Muitos desenvolvedores ao desenvolver aplicações orientadas a objeto criam um arquivo PHP para cada definição de classe. Um dos maiores contratempos é ter de escrever uma longa lista de includes no início de cada script(um include para cada classe necessária).
Existem 2 formas de se fazer um autoloading para inclusão dessas classes, a primeira porém
não muito legal, pois você acaba fazendo includes da mesma forma usando um include ou require:
function __autoload($class)    {
   require_once("includes/class/".$class.".class.php");
 }
A única exigência é que o nome do arquivo que contém a classe deve estar igual ao nome da classe

Já a segunda forma mais elegante, os arquivos necessários serão carregados automaticamente 
Para isso vamos criar a classe autoloader que carregará todos os arquivos necessários para a execução dos nossos scripts, estejam eles nos diretorios "/model", "/controller", "/lib" ou "/helper"




class autoloader {
    public static $loader;
    public static function init()
    {
        if (self:: $loader == NULL)
            self:: $loader = new self();

        return self:: $loader;
    }
    public function __construct()
    {
        spl_autoload_register(array($this,'model'));
        spl_autoload_register(array($this,'helper'));
        spl_autoload_register(array($this,'controller'));
        spl_autoload_register(array($this,'library'));
    }
    public function library( $class)
    {
        set_include_path('lib/');
        spl_autoload_extensions('.library.php');
        spl_autoload($class);
    }
    public function controller($class)
    {
        $class = preg_replace('/_controller$/ui',''$class);
        
        set_include_path('controller/');
        spl_autoload_extensions('.controller.php');
        spl_autoload($class);
    }
    public function model($class)
    {
        $class = preg_replace('/_model$/ui',''$class);
        
        set_include_path('model/');
        spl_autoload_extensions('.model.php');
        spl_autoload($class);
    }
    public function helper($class)
    {
        $class = preg_replace('/_helper$/ui',''$class);

        set_include_path('helper/');
        spl_autoload_extensions('.helper.php');
        spl_autoload$class);
    }
}




//chamando o autoloader
autoloader::init();



//usando uma classe que está no diretório /lib com o arquivo chamado ITest.library.php
$objITest = new ITest();
$objITest->iteste();


//classe ITest

class ITest{
function __construct(){}
function iteste(){
print("Usando a classe ITeste com autoloader");
}
}


O resultado será :
Usando a classe ITeste com autoloader


A restrição é de que o arquivo deve ser o mesmo do nome da classe a ser usada.
Este recurso é muito utilizado em frameworks para facilitar no desenvolvimento, isto faz com que o desenvolvedor não tenha que se preocupar com aquele monte de includes necessários para usar suas classes e interfaces.
Por hoje é só.

Nenhum comentário:

Postar um comentário