É costume ao se desenvolver implementando Design Patterns, a criação de um arquivo por classe e vários packages para organização de seu projeto. Com o crescimento do projeto, acaba se tornando uma tarefa ardua escrever todos os includes necessários no inicio de cada classe. No PHP 5, foi adicionado a função de autoload para facilitar o desenvolvimento, com ela, não é mais necessario uma longa lista de includes, basta instanciar a classe que esta será automaticamente carregada.
Um exemplo de uso de autoload:
[PHP]
< ?php
function __autoload($class_name) {
require_once $class_name . '.php';
}
$obj = new MyClass1();
$obj2 = new MyClass2();
?>
[/PHP]
O único problema que teremos é que dependendo do package, teremos que adaptar o caminho do require_once, o que torna-se trabalhoso. Uma maneira de resolver isso seria adicionar os diretorios do package no include_path do PHP, podemos implementar a função set_include_path que define o caminho do include_path em tempo de execução.
[PHP]
set_include_path(“.;C:\package1.;C:\package2”);
[/PHP]
Agora não importa o caminho meu package, a classe será carregada sem problemas. Mas podemos melhorar implementando a SPL(Standard PHP Library) no meu projeto, para isso usarei a função spl_autoload, que é usada como implementação padrão do __autoload(). Ela procura os nomes das classes em minúsculo com as extensões .inc e .php no include path.
Para completar teremos um método para varrer os diretorios, para inclui-los no include_path, tomando o devido cuidado para não listar diretorios que podem comprometer o projeto.
[PHP]
< ?php
class Loader
{
public function __construct()
{
$dir = self::scanDirectories(dirname(__FILE__));
for ($i=0;$i
{
$path = $rootDir.’/’.$content;
if(!in_array($content, $invisibleFileNames))
{
if(is_dir($path) && is_readable($path))
{
$allData[] = $path;
$allData = self::scanDirectories($path, $allData);
}
}
}
return $allData;
}
}
$loader = new Loader();
?>
[/PHP]
E para testar:
[PHP]
/*require_once ‘br/com/leonardofranca/vo/Vo1.php’;
require_once ‘br/com/leonardofranca/vo/Vo2.php’;
require_once ‘br/com/leonardofranca/services/Services.php’;
require_once ‘br/com/leonardofranca/controller/FrontController.php’;
require_once ‘br/com/leonardofranca/view/Form.php’;
require_once ‘br/com/leonardofranca/Main.php’;*/
require_once ‘Loader.php’;
class Test
{
function __construct()
{
$service = new Services();
$vo1= new Vo1();
$vo2= new Vo2();
$form= new Form();
$main= new Main();
}
}
$test = new Test();
[/PHP]
Pode ser usado também com o ZendAMF:
[PHP]
require_once ‘Zend/Amf/Server.php’;
//require_once ‘HelloWorld.php’;
//require_once ‘RoundTrip.php’;
//require_once ‘services/World.php’;
//require_once ‘services/Hello.php’;
//require_once ‘services/UserVO.php’;
//require_once ‘br/com/leonardofranca/vo/ContatosVO.php’;
//require_once ‘br/com/leonardofranca/Contatos.php’;
//…
require_once ‘Loader.php’;
/** Bootstrap */
// Instantiate server
$server = new Zend_Amf_Server();
$server->setClass(‘Contatos’);
$server->setClass(‘HelloWorld’);
$server->setClass(‘RoundTrip’);
echo($server->handle());
[/PHP]
referencias
SPL(Standard PHP Library)
http://br.php.net/autoload
http://www.rafaeldohms.com.br/2007/01/10/otimizando-codigo-com-__autoload/pt/
muito bom
Muito bom!
Agora, no exemplo da função set_include_path, faltou o PATH_SEPARATOR, não?
Opa! bem lembrado!
muit bom, porem nao deu certo comigo, deu erro de classe nao encontrara, a classe que eu chamei, igual ao exemplo…
aparece algum erro no log do php?
Simplesmente a classe evocada nao é incluida…
Bom eu sou iniciante em php e em programação também, porém eu estou estudando no livro php Orientado a objetos e eu vi a função autoload e tentei implementá-la, sem sucesso, gostaria de saber se alguém pode me ajudar?
Eu fiz e deu certo :
function __autoload($classe){
if(file_exists(“app.ado/{$classe}.class.php”)){
include_once “app.ado/{$classe}.class.php”;
}
}
Vc provavelmente errou o caminho do diretório.