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
Postar um comentário