Bom, agora que já criamos uma classe Pessoa, com seus métodos e atributos com visibilidade definidas, vamos tratar de derivação, extensão, pondo em questão o conceito de herança. Trago a seguir mais um exemplo, dessa vez um extensão da classe criada anteriormente (classe Pessoa), mostrando o uso da palavras reservada 'extends' que possibilita que utilizemos herança.
Vejamos o exemplo da classe Funcionario:
/**
* Classe destinada a teste de sintaxe do PHP5
* @author Evaldo Barbosa
* @since date 23-02-2006
* @version 0.2.0
* @copyright 2006 - Tryade Software - Todos os direitos reservados.
*/
class funcionario extends Pessoa {
private $descontos = array();
private $salario;
private $totalLiquido;
public $matricula;
function __construct() {
parent::Pessoa();
}
function __destruct() {
unset($this);
}
/**
@desc Especifica o salário do funcionário
@return método
@param currency $valor
*/
function setSalario($valor) {
//$this->salario = (eregi("(0-9)", $valor)) ? eregi_replace("([^0-9.])","",eregi_replace(',','.',$valor)) : 0;
$this->salario = eregi_replace("([^0-9.])","",eregi_replace(',','.',$valor));
$this->setRenda($this->salario);
}
/**
* Cria os descontos e subtrai automaticamente da renda bruta
* @return método
* @param float $d
*/
function addDesconto($d) {
$this->descontos[] = $d;
while (list($key,$value) = each($this->descontos)) {
parent::setRenda (parent::getRenda() - $value);
}
}
/**
* Exibe a renda mensal do funcionário (valor bruto e líquido)
*
* @return string
*/
function getRendaMensal() {
$ret = "Valor Bruto: R$ " . number_format($this->salario,2,',','.') . "
";
$ret .= "Valor líquido: R$ " . number_format(parent::getRenda(),2,',','.') . "
";
return $ret;
}
/**
* Exibe o valor do salário do funcionário
*
* @return string (formatado como currency)
*/
function getSalario() {
return $this->salario;
}
/**
* Exibe a lista de descontos aplicados ao salário do funcionário
*
* @return string
*/
function getDescontos() {
$i = 0;
$ret = "Descontos:
";
foreach ($this->descontos as $value) {
$ret .= "$i : R$ " . number_format($value,2,",",".") . "
";
$i++;
}
return $ret;
}
}
Comentando o exemplo:
A classe Funcionario é uma derivação da classe Pessoa e uma ressalva eu quero fazer nesse momento. É quanto ao método __construct de Funcionario que inicia a classe Pessoa através de sua palavra reservada 'parent' que faz referência à herança da classe de hierarquia mais alta. A palavra 'parent' aparece várias vezes ainda no código, sempre fazendo a mesma coisa, referência. Seus getters e setters seguem o mesmo propósito do exemplo anterior (manipular valores de atributos).
A única novidade aqui é a documentação do código, mas isso é assunto para outro artigo. Não nos aprofundaremos nisso nesse momento.