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

antoniomanteiga

[PHP] Aumentar a velocidade de scripts PHP

24 mensagens neste tópico

Conheci hoje o fórum e como introdução deixo uma dica.

O procedimento que normalmente se usa para lidar com saltos condicionais com base no valor duma variável cujo valor possível faz parte duma lista de valores conhecidos , é o uso de uma estrutura de controlo switch.

Como exemplo vamos supor a presença de uma classe de nome "antiga" cujo método construtor recebe uma variável de nome "$accao" cujo valor pode ser "comer","beber", ou "dormir",

A classe tem mais três métodos, um por possível valor da variável "$accao". comer() para "comer", beber() para "beber", e dormir() para "dormir".

Para, dependendo do valor da variável $accao, ser executado o respectivo método, o procedimento normalmente usado é o seguinte:

<?php

class antiga
{
function __construct($accao)
{
	switch($accao)
	{
		case ("comer"):
		{
			$this->comer();
			break;
		}
		case ("beber");
		{
			$this->beber();
			break;
		}
		case ("dormir");
		{
			$this->dormir();
			break;
		}

	}

}
function comer()
{
}
function beber()
{
}
function dormir()
{
}
}

$objecto = new antiga("comer");

?>

O método que vou mostrar agora é, em bastantes casos, útil pois é mais rápido que um switch e  reduz o código. Pode também ser usado sem recurso a classes. Tem limitações, já que o nome da função tem que ser igual ao do valor da variável e torna o código menos inteligível. Contudo é interessante e se o seu funcionamento for percebido pode ser útil mais tarde ou mais cedo.

<?php

class nova
{
function __construct($accao)
{
	$this->$accao();		
}
function comer()
{
}
function beber()
{
}
function dormir()
{
}
}

$objecto = new nova("comer");

?>

O valor da variável $accao é usado como nome duma função que é chamada.

Esta particularidade da linguagem PHP é semelhante à função "eval()" mas muito mais rápida, também mais limitada, mas ideal para o caso descrito.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Que giro, isto funciona apenas no PHP 5 de certeza certo ?

Sim, correcto. Não tens o evento __construct nem __destroy nas classes do PHP4.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isto é umexemplo básico ( no bom sentido ) de polimorfismo.

Para os que já viram tanta nestes fóruns sobre POO, está aqui levantada a ponta do véu do potencial da programação orientada a objectos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Que giro, isto funciona apenas no PHP 5 de certeza certo ?

Sim, correcto. Não tens o evento __construct nem __destroy nas classes do PHP4.

O método mágico _construct não é necessário, nem sequer o uso de classes. Se alguém quiser experimentar em PHP4 com o uso de classes, mude o nome do método _construct e depois da instanciação do objecto, faça-lhe uma chamada (vai ter uma linha a mais):

<?php

class nova
{
function accao($accao)
{
	$this->$accao();		
}
function comer()
{
}
function beber()
{
}
function dormir()
{
}
}

$objecto = & new nova;
        $objecto->accao("comer");

?>

Sem classes:

<?php


        function comer()
{
}
function beber()
{
}
function dormir()
{
}
        function accao($accao)
{
	$accao();		
}

        accao("comer");



?>

ou mais simples ainda

<?php


        function comer()
{
}
function beber()
{
}
function dormir()
{
}

$accao = "beber";
$accao();

?>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O método mágico _construct não é necessário, nem sequer o uso de classes. Se alguém quiser experimentar em PHP4 com o uso de classes, mude o nome do método _construct e depois da instanciação do objecto, faça-lhe uma chamada (vai ter uma linha a mais):

Eu sei isso tudo que disseste, mesmo que raramente use OOP em PHP. :)

Já agora, só falaste para o __construct, então e o __destroy? ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu sei isso tudo que disseste, mesmo que raramente use OOP em PHP. :)

Já agora, só falaste para o __construct, então e o __destroy? ;)

Faz-me um favor: lê o tópico com atenção. O método mágico __destroy não tem nada a ver com o assunto.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Faz-me um favor: lê o tópico com atenção. O método mágico __destroy não tem nada a ver com o assunto, apenas alguém referiu que em PHP4 ele não se encontra implementado.

Eu leio os tópicos sempre com atenção. ;)

1º - não há métodos mágicos. Há simples métodos e alguns deles são chamados aquando de eventos (caso do __construct e do __destroy).

2º - quem referiu que o __destroy (e o __construct também) não estava implementado no PHP4 fui eu.

3º - eu disse que não tens os eventos __construct e __destroy no PHP4, ao que tu respondeste que podia simular o __construct definindo um método com o mesmo nome da class. Depois dessa tua resposta, eu perguntei-te o que poderias fazer para simular o __destroy, já que o tinhas feito para o __construct.

4º - Bem vindo à comunidade, depois cria o teu post de apresentação.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu leio os tópicos sempre com atenção. ;)

1º - não há métodos mágicos. Há simples métodos e alguns deles são chamados aquando de eventos (caso do __construct e do __destroy).

2º - quem referiu que o __destroy (e o __construct também) não estava implementado no PHP4 fui eu.

3º - eu disse que não tens os eventos __construct e __destroy no PHP4, ao que tu respondeste que podia simular o __construct definindo um método com o mesmo nome da class. Depois dessa tua resposta, eu perguntei-te o que poderias fazer para simular o __destroy, já que o tinhas feito para o __construct.

4º - Bem vindo à comunidade, depois cria o teu post de apresentação.

.  Há metódos mágicos - http://www.phpbuilder.com/manual/en/language.oop5.magic.php -  que são chamados aquando de certos eventos

.  Se queres substituir o método __destruct acrescenta um método, chama-o e faz unset($objecto).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

.  Há metódos mágicos - http://www.phpbuilder.com/manual/en/language.oop5.magic.php -  que são chamados aquando de certos eventos

.  Se queres substituir o método __destruct acrescenta um método, chama-o e faz unset($objecto).

Esse "mágico" é que pronto... por esse ponto de vista, os eventos onclick do HTML também eram mágicos... ;) Em relação ao _destruct, estava a perguntar uma alternativa sem ter de recorrer a mais uma instrução. :)
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esse "mágico" é que pronto... por esse ponto de vista, os eventos onclick do HTML também eram mágicos... ;) Em relação ao _destruct, estava a perguntar uma alternativa sem ter de recorrer a mais uma instrução. :)

O evento "onclick" não faz parte da especificação HTML mas da de javascript, e sendo javascript uma linguagem com base em eventos é normal um evento não ser chamado de mágico. Já em PHP eventos são condições especiais em que métodos são executados, daí o serem mágicos.

* Moderado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estou farto da conversa de treta, que se distancia da razão do tópico Se queres mostrar que sabes, primeiro aprende e depois mostra que sabes, e aproveita faz isso a gajos da tua idade.

Acho que estás um pouco confuso. ;)

O evento "onclick" não faz parte da especificação HTML mas da de javascript, e sendo javascript uma linguagem com base em eventos é normal um evento não ser chamado de mágico. Já em PHP eventos são condições especiais em que métodos são executados, daí o serem mágicos.

JavaScript não é baseado em eventos, vai aprender um pouco. ;)

E para mim acabou o off-topic. ;)

tem piada que depois de dizeres que "onclick" faz parte de HTML e  que não há métodos mágicos em PHP, ainda me venhas dizer que Javascript não é baseado em eventos.

* Moderado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para o bom funcionamento do fórum, alguns posts foram modificados e um apagado.

É de relembrar que o fórum não permite ofensas/faltas de respeito.

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

obrigado LuRsT, foste o único a dar-me as boas vindas.

Bem vindo! eheh já não foi o unico! ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ainda não tinha dito mas, esta particularidade da linguagem PHP chama-se "variable functions".

http://php.net/manual/en/functions.variable-functions.php

Dá bastante jeito essa funcionalidade para evitar o uso de eval()s por exemplo.

O PHP também tem funções "anónimas" (como o lambda do Python por exemplo) que também são bastante úteis e que só descobri há uns tempos: http://pt2.php.net/create_function

$areaCubo = create_function('$x', 'return pow($x, 2); ');
echo $areaCubo(3);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É possivel simular o __construct e __destruct no PHP 4 utilizando um hack...

class nova extends hack
{
function __construct()
{
            echo '__contruct';
}
function comer()
{
}
function beber()
{
}
function dormir()
{
}

       function __destruct() {
           echo '__destruct';
      }
}

$objecto = new nova();

class hack {

        function hack() {

                $args = func_get_args();

                call_user_func_array(array( &$this, '__construct' ), $args );

                if(method_exists( $this, '__destruct' )) {
                        register_shutdown_function(array( &$this, '__destruct' ));
                }
        }

        function __construct () {}
        function __destruct () {}

}

EDIT: btw, djthyrax em alguns posts tens __destroy em vez de __destruct...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É possivel simular o __construct e __destruct no PHP 4 utilizando um hack...

class nova extends hack
{
function __construct()
{
            echo '__contruct';
}
function comer()
{
}
function beber()
{
}
function dormir()
{
}

      function __destruct() {
          echo '__destruct';
     }
}

$objecto = new nova();

class hack {

       function hack() {

               $args = func_get_args();

               call_user_func_array(array( &$this, '__construct' ), $args );

               if(method_exists( $this, '__destruct' )) {
                       register_shutdown_function(array( &$this, '__destruct' ));
               }
       }

       function __construct () {}
       function __destruct () {}

}

EDIT: btw, djthyrax em alguns posts tens __destroy em vez de __destruct...

kingless eu desaconselho esse hack, a menos que se use outro nome para as funções, já que assim é incompatível com php5.

Além disso, se não estou em erro, em php4 podes simular a função __construct do seguinte modo:

class exemplo
{
    function exemplo($a,$b)
   {
   }
}

$ex = & new  exemplo(10,20);

?>

Com uma função com o mesmo nome que a classe.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Além disso, se não estou em erro, em php4 podes simular a função __construct do seguinte modo:

class exemplo
{
    function exemplo($a,$b)
   {
   }
}

$ex = & new  exemplo(10,20);

?>

Com uma função com o mesmo nome que a classe.

Sim, isso faz o serviço. :)

Uma coisa, não é $ex &= new exemplo?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Uma coisa, não é $ex &= new exemplo?

=& está correcto.

=& atribui-lhe, neste caso e por referência, o valor de um objecto instanciado com base numa classe.

&= faz um AND bit a bit, o que faria, com que a variável fica-se com o valor 0, já que o valor da variável iria ser tratado como false.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

kingless eu desaconselho esse hack, a menos que se use outro nome para as funções, já que assim é  incompatível com php5.

Esse hack é totalmente compatível com php 4 e php 5 e não é preciso utilizar outros nomes para as funções... esse hack até é utilizado pelo Joomla 1.5 e por um dos melhores php frameworks o Cake PHP.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

kingless eu desaconselho esse hack, a menos que se use outro nome para as funções, já que assim é  incompatível com php5.

Esse hack é totalmente compatível com php 4 e php 5 e não é preciso utilizar outros nomes para as funções... esse hack até é utilizado pelo Joomla 1.5 e por um dos melhores php frameworks o Cake PHP.

Sim, tens razão. erro meu.

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