É 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
-
function __autoload($class_name) {
-
require_once $class_name . '.php';
-
}
-
-
$obj = new MyClass1();
-
$obj2 = new MyClass2();
-
?>
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.
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
-
class Loader
-
{
-
public function __construct()
-
{
-
for ($i=0;$i<count($dir);$i++)
-
{
-
$str .= ".;".$dir[$i];
-
}
-
}
-
-
public static function load($class)
-
{
-
}
-
-
{
-
foreach($dirContent as $key => $content)
-
{
-
$path = $rootDir.'/'.$content;
-
{
-
{
-
$allData[] = $path;
-
$allData = self::scanDirectories($path, $allData);
-
}
-
}
-
}
-
return $allData;
-
}
-
}
-
$loader = new Loader();
-
?>
E para testar:
-
/*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();
Pode ser usado também com o ZendAMF:
-
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());
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.