PHP 5 – Autoload de Objetos
Nos últimos tempos, tenho tido pouco tempo para me dedicar aos padrões web, então, acho que vou me arriscar a escrever sobre PHP. Com um servidor de hospedagem em vista, que suporta o PHP 5, voltei no manual do php e dei uma lida para revisar algumas coisas. Comecei pelo autoload de objetos.
Na empresa onde trabalho, cada classe fica em um arquivo próprio, sendo sempre o nome da classe o mesmo nome do arquivo. Dessa forma, o sistema fica bem organizado, facilitando a manutenção dos programas.
O ponto negativo, é que temos sempre que nos preocupar em incluir cada arquivo destes, sempre que precisamos utilizá-los.
No php 5, temos uma função global __autoload() que é chamada sempre que você tentar instanciar um objeto que não foi definido (provavelmente pelo fato de não termos incluido o arquivo da classe).
Caso você trabalhe da mesma forma como eu aqui, fica muito simples abandonar os includes utilizando o __autoload():
function __autoload($nomeDaClasse) {
require_once($nomeDaClasse.'.php');
}
$pessoa = new Pessoa();
Este é um exemplo simples, utilizando também na documentação do php, mas que retrata bem o que precisamos. Ao tentar instanciar o objeto Pessoa, caso o arquivo não tenha sido incluido, o método __autoload() é chamado e faz o serviço sujo de incluir o arquivo da classe.
[...] tipos de controllers quisermos. Pra facilitar ainda mais o trabalho, você ainda pode implementar a função __autoload() para não precisar ficar sempre incluindo a classe nos arquivos que for [...]
Newton Wagner - Especializando Controllers no Code Igniter
18 Oct 07 at 11:30
Interessante, mas, qual seria uma solução elegante (digamos assim), em caso de uma estrutura de pastas MVC, por exemplo?
Vinicius
19 Jun 09 at 16:17
Uma solução seria a seguinte:
Variáveis:
$pasta = nome da pasta onde esta uma determinada classe;
$classe = titulo da classe a ser usada.
function __autoload($classe)
{
$pastas = array(‘pasta_1′, ‘pasta_2′, ‘pasta_3′);
foreach ($pastas as $pasta)
{
if (file_exists(“{$pasta}/{$classe}.class.php”))
{
include_once “{$pasta}/{$classe}.class.php”;
}
}
}
Abrçs
Alexandre Lopes
11 Mar 10 at 12:00