Autoload no PHP 5
É 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/
6 Comments
Other Links to this Post
RSS feed for comments on this post. TrackBack URI


By anderson, May 16, 2009 @ 22:10
muito bom
By Vinicius, June 19, 2009 @ 15:34
Muito bom!
Agora, no exemplo da função set_include_path, faltou o PATH_SEPARATOR, não?
By Leonardo França, June 24, 2009 @ 13:13
Opa! bem lembrado!
By Igor Carvalho, August 24, 2009 @ 11:33
muit bom, porem nao deu certo comigo, deu erro de classe nao encontrara, a classe que eu chamei, igual ao exemplo…
By Leonardo França, August 27, 2009 @ 17:43
aparece algum erro no log do php?
By Igor Carvalho, October 25, 2009 @ 08:25
Simplesmente a classe evocada nao é incluida…