• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

MX+

[PHP] Objectos Mágicos: Função __autoload()

6 mensagens neste tópico

autload.jpg

Hoje vou apresentar uma função que a maior parte da comunidade PHP não conhece.

Está englobada dentro das "funções mágicas", foi incluída no PHP5, mas é necessário defini-la.

Em projectos com uma escala média, em que contamos com mais do que alguns ficheiros é praticamente certo que vamos utilizar classes, e incluí-las com ficheiros externos.

<?php

require_once "class/mysql.php";

$SQL = new MySQL;

?>

Este é um exemplo típico duma aplicação simples/complexa. Incluímos o nosso ficheiro em todos as páginas em que vamos necessitar duma ligação à base-de-dados e em cada uma delas vamos iniciar o nosso objecto.

Agora podemos continuar a seguir a linha de pensamento, e para um projecto funcionar vai precisar também duma classe para gerir os utilizadores, outra, quem sabe, para gerir os templates - e para os mais exigentes, também podemos incluir uma para cache.

Vamos utilizar muito provavelmente uma página, normalmente denominada por kernel ou global, que vai incluir tudo isto por nós em todas as páginas, ou na única página, do nosso projecto.

Mas tudo fica mais simples se fizermos uso desta função. Imaginemos o seguinte pedaço de código, que representa literalmente como ficaria o nosso index:

<?php

function __autoload($class_name)
{
require_once "class/{$class_name}.php";
}

$SQL	   = new MySQL;
$Templates = new Smarty;

?>

Acho que já se tornou evidente as capacidades desta função. Quando criamos um novo objecto, se o interpretador não encontrar a class definida chama a função __autoload e passa como argumento o nome da class. Tudo o resto fica a cargo da nossa imaginação.

Esta função já é usado em frameworks do topo como codeignitor, cakephp e a recente, e aclamada, Zend Framework.

Além disso está parcialmente provado que fica aproximadamente ~3.7x mais eficiente usar __autoload em vez de usar directamente o require_once.

Fica aqui um último exemplo de como eu uso esta função em algumas aplicações, tornando o meu código mais legível e incorporando um log de erros. Quando chamo uma class, cada _ (underscore) representa um nível mais baixo em pastas, permitindo assim organizar facilmente módulos e classes.

<?php

function __autoload($classe)
{
$ficheiro = str_replace("_", "\\", $classe);
$ficheiro = "class/{$ficheiro}.php";

if ( !file_exists($ficheiro) )
{
	$log   = fopen("error_log.txt", "a");
	$data  = date("Y/m/d H:i:s");
	$texto = "[{$data}] {$classe} não encontrada; Ficheiro {$ficheiro}\n";

	fwrite($log, $texto);

	die();
}

require_once $ficheiro;
}

#
# ....
#

$DB	   = new Database_MySQL;
$Template = new Template_Smarty;

#
# ... Resto Codigo
#

echo "Bibliotecas abertas com sucesso..";

?>

Fonte

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas isto só se faz uma vez e ele fica incluido em todos os ficheiros que eu trabalhar ?!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas isto só se faz uma vez e ele fica incluido em todos os ficheiros que eu trabalhar ?!

Se usares uma estrutura como a do SMF, basta fazeres isso no index.php. :)
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O problema de incluíres um ficheiro com os includes das classes todas que tens é que estas a obrigar o php a lêr ficheiros e definir classes que não vais precisar e isso em termos de performance e gestão de recursos da máquina nem sempre é desejável

com o __autoload() o ficheiro da classe só é incluído se a classe for usada

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O problema de incluíres um ficheiro com os includes das classes que todas que tens é que estas a obrigar o php a lêr ficheiros e definir classes que não vais precisar e isso em termos de performance e gestão de recursos da máquina nem sempre é desejável

com o __autoload() o ficheiro da classe só é incluído se a classe for usada

Exactamente. Bom ponto, vou acrescentar isso no artigo ^^

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora