Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Perfect Lion

__autoload();

Recommended Posts

Fala galera tudo certo? espero que sim.

 

Bem sei que você deve está se perguntando.

"Que bendito é esse negocio que o Lion ta falando???"

 

Bem seria algo que pode torna sua programação muito mais flexivel e tbm que muitos framework da vida vem começando a usar esse tipo de flexibilidade apartir do PHP5 é felizmente esse artigo é para o PHP5 pois trabalhar com CLASSEs em PHP4 num rola e totalmente uma gambiarra só..

 

Hoje vou explicar aqui como trabalhar com classes mais flexiveis. podendo assim se torna um padrão na hora em que você irá programar seus sistema.

 

Eu aprendi esse método em meu novo serviço pois aqui tem só nego ferá e então estamos criando framework nosso mesmo e o que eu aprendi vou está passando aqui para a galera ;)

 

Então chega de enrolação e bora para o que intereça

 

--

 

Você que trabalha com classes a algum tempo já deve ter percebido que seu codigo vive cheio de require_one, includes para tudo quanto é canto certo? e fazendo você perder um tempo as vezes quando dá erro e você nem imagina em qual arquivo é.

 

Imagina. que você tenha uma classe chamada Clientes:

 

Cliente.class.php

<?phpclass Clientes{	private $strNome;		public function __construct(){		$this->strNome = "João";	}		public function getNome(){		return $this->strNome;	}}?>

Agora para você chamar essa classe você tem que fazer algo como

 

index.php

<?phprequire_once("Classes/Cliente.class.php");$objCliente = new Clientes;echo $objCliente->getNome();# imprime João;?>

Certo? se viu que eu tive que dar um include do nosso arquivo de classe Clientes para podermos usala? agora se eu te diria que não seria mais preciso esses includes você iria ficar feliz? haahhaha agora você está se perguntando novamente "Pó Lion tu ta tirando com minha kra né? como vou chamar ela então? vou criar.. 'Classe vem aqui' :P". Engrasadinho você em... :P

 

Nada agora que vamos fazer o PHP ser nosso parceiro.

 

Como você sabe, desde a atualização do PHP5 foi implementado algumas funções novas para se trabalhar com CLASSEs uma que vamos usar é o __autoload() o que ele faz? quando você instancia uma classe em sua aplicação ele chama essa função antes de tudo e faz uma ação que tenha dentro dele. vejamos

Vamos criar um arquivo chamado functions.inc com a nossa nova função __autoload();

 

functions.inc

<?phpfunction __autoload($strClass){	echo $strClass;}?>

Agora vamos fazer o seguinte.. no index.php ao invez de você fazer o require da classe cliente faça da função

 

index.php

<?phprequire_once("inc/functions.inc");$objCliente = new Clientes;# imprime João;?>

Se vai perceber que vai imprimir na tela o nome Clientes pois nós setamos lá na função para ele imprir o resultado. Agora pense. analise a situação. Você está conseguindo enchegar nisso ae algo muito util? algo que vai fazer você reprogramar todo o seu sistema para esse metodo?

"Humm acho que você vai mandar ele dar um require ali dentro da função __autoload né?"

Opa isso ae.

Imagina você da um require somente no arquivo functions.inc e apartir da i você terá somente que instanciar o seu objeto para trabalhar com ele e não se preocupar em ficar dando requires... =D

 

Então nossa função ficaria da seguinte forma.

 

functions.inc

<?phpfunction __autoload($strClass){	return require_once($strClass . "class.php");}?>

E na index.php estaria assim:

 

index.php

<?phprequire_once("inc/functions.inc");$objCliente = new Clientes;echo $objCliente->getNome();# imprime João;?>

Bem mais você ainda não conseguiu ver o quanto é util esse __autoload() você pego só a visão vamos dizer abstrata do negocio. vamos agora mais para o lado Barroco :P ahhahaha

 

Imagina se você trabalha com padrão MVC você sabe que você tem a pasta chamada Model e outra chamada Controller essas 2 pastas contém classes uma ligando na outra e você já trabalha separando elas então imagina que você tenha o seguinte.

 

#############################

Hirearquia de pastas:

|- root/www

|--- Controller

|------ Clientes.class.php <- classe de controle de ações

|--- Model

|------ Clientes.class.php <- classe de consultas no DB

|--- Inc

|------ functions.php

|- index.php

#############################

 

Bem como você iria fazer para chamar uma classe de uma pasta ou uma classe de outra pasta?

Complicado agora né? mais se você pensar bem você tem como fazer isso muito simples. você sabe que ao instanciar uma classe você consegue recuperar o nome dela correto? então porque num tratar esse nome? é isso mesmo imagina. você teria algo como MinhaPasta_MeuArquivo e você poderia depois dentro da função tratar esse caminho com um explode e implode que se acha?

"Nossa é mesmo."

Então vamos ver como fica nossa função __autoload();

 

functions.inc

<?phpfunction __autoload($strClass){	$strClass = implode("/",explode("_",$strClass)); # então aqui ele vai explodir minha string separando por _ e depois vou juntar o array criado por uma / então se eu chamar algo como new Controller_Cliente então ele vai virar isso Controller/Cliente e como eu tenho uma concatenação logo abaixo fica Controller/Cliente.class.php	require_once($strClass . "class.php");}?>

Então imagina agora você iria então ter que fazer isso no index.php

 

index.php

<?phprequire_once("inc/functions.inc");$objCliente = new Controller_Clientes;echo $objCliente->getNome();# imprime João;?>

Que ele iria na pasta Controller e iria pegar o arquivo Clientes e dar um include dele para você. Ai você me fala "Lion show de bola. isso =) mais tem um problema ta dando erro ele disse que num existe e tals essa class porque? e eu respondo. bem é porque veja o nome que você está instanciando Controller_Cliente a sua classe lembra que criamos "class Clientes {}" então você está chamando o Controller_Clientes e isso não existe criado ai você se pergunta.. " o que fazer então? "

Simples abra novamente o seu arquivo Cliente.class.php e edita o nome da class

 

Cliente.class.php

<?phpclass Controller_Clientes{	private $strNome;		public function __construct(){		$this->strNome = "João";	}		public function getNome(){		return $this->strNome;	}}?>

Não mude o nome do arquivo e sim mude o nome de dentro da classe. Lembra o nome do arquivo será sempre o ultimo nome que você irá criar depois do "_"

 

Agora faça o teste novamente. Viu agora foi né?

 

Lembre que isso tbm funciona para classes extendidas.

 

Vamos fazer um teste.. quem trabalha com MVC sabe que o Controller por sua vez necessita extender um arquivo seu do Model caso ele tenha que fazer alguma consulta no db.

 

Então imagina que temos o arquivo Clientes.class.php dentro de nossa pasta Model da seguinte forma

 

Clientes.class.php

<?phpclass Model_Clientes{		public function __construct(){		"....";	}	}?>

Agora em nossa classe Clientes.class.php da pasta Controller temos que extender do model

 

Ficaria assim:

 

Cliente.class.php

<?phpclass Controller_Clientes extends Model_Clientes {	private $strNome;		public function __construct(){		parent::__construct();		$this->strNome = "João";	}		public function getNome(){		return $this->strNome;	}}?>

Viu? nem preciso dar o new instancia. pois quando você faz o extends ele tbm executa primeiro a função __autoload();

 

Então agora use suas imaginação e modele seu sistema com mais agilidade e flexibilidade =D

 

Até a próxima;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Falae Perfect Lion, beleza? Legal esse tutorial, a OOP nos proporciona essas vantagens mesmo, o que é mais legal é utilizar este modelo para criação de frameworks.Tenho um framework chamado Synus que trabalha com Stored Procedures, estou usando em alguns projetos e se quizer lhe passo para dar uma testada.Vlww pelo tutorial, não te add ainda no skype e no msn pq mal conectando, mas vou tentar conectar hoje e ja add.FlwwwwParabéns ae pelo tutorial..

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.