PHP - Modificando métodos através da extensão de classes




Extensão de classes é uma ótima maneira de organizar e reaproveitar código, tornando a aplicação mais clara e de manutenção mais simples. Vamos mostrar aqui um exemplo muito simples de extensão de classe utilizando os mesmos nomes de método.

Isso pode ser muito útil, por exemplo, quando temos uma chamada de método em várias partes do código e precisamos mudar alguma coisa neste método porém não queremos mexer diretamente nele.

Vamos supor que o método statement() dentro da classe Main é chamado em trinta pontos de sua aplicação e você precisa alterar a saída dele.

main.class.php

 <?php  
      Class Main  
      {  
           public function statement()  
           {  
                return "Classe 'Main'";  
           }  
      }  


index.php


 <?php

 include "main.class.php";
 $new = New Main();

 echo $new->statement();
 echo "\n"; 




Uma opção seria alterar o método mas você não quer mexer diretamente nele pois já foi muito testado e funcionou sempre corretamente ou não quer 'sujar' o commit. Outro motivo para não querer mexer diretamente no método é, por exemplo, o caso em que você deseja saídas diferentes para instâncias diferentes como por exemplo um template de um blog que tem a versão Web e a Versão AMP.

Nestes casos extensão de classes é o ideal.

Devido as diferenças de markup entre as duas versões no template você quer manter a chamada unica porém estendendo o método para a versão AMP com as alterações necessárias.

Vamos criar então a Classe mod.class.php que faz a extensão da classe Main

 <?php  
      Class Mod extends Main  
      {  
           public function statement()  
           {  
                return "A classe 'Mod' modifica a ".parent::statement();  
           }  
      }  


index.php


 <?php

 include "main.class.php";
 include "mod.class.php";
 $new = New Mod();

 echo $new->statement();
 echo "\n"; 




parent::statement() chama o método original na classe estendida e o modifica dentro da nova classe adicionando um texto.

Agora vamos implementar o caso em que o método original Main() pode ser utilizado diretamente ou o método estendido Mod() pode ser chamado.

index.php

 <?php  
      include "main.class.php";  
      switch ( @$argv[1] ) {  
           case '1':  
                $new = New Main();  
                break;  
           case '2':  
                include "mod.class.php";  
                $new = New Mod();  
                break;  
           default:  
                $new = New Main();  
                break;  
      }  
      echo $new->statement();  
      echo "\n"; 



Aqui fica clara a utilização da técnica. Não mexemos em nada da saída $new->statement() mas dependendo da opção feita ( 1 ou 2 ) a Classe Main() é estendida ou não.

Assim preservamos a saída original ou a modificamos caso necessário.



Comentários

Postagens mais visitadas deste blog

MySQL - Completando quantidades fixas de caracteres com as funções LPAD() e RPAD()

MySQL - Clonando tabelas na linha de comando

PHP - Gerando arquivo em UTF-8 com fwrite() e utf8_encode()