Abordagem exemplificada de orientação à objeto com PHP 5

Este artigo vem a complementar um outro que escrevi sobre orientação a objeto nos moldes do PHP4. Dessa vez venho trazendo o que houve de mudanças para o PHP5 com duas classes que exemplificam bem essas mudanças.

[ Hits: 36.221 ]

Por: Evaldo Barbosa em 17/08/2006


Derivando 'Funcionario' de 'Pessoa'



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.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Construtores e Destrutores, o que mudou?
   3. A filosofia dos 'getters' e dos 'setters'
   4. Construindo uma classe 'Pessoa'
   5. Derivando 'Funcionario' de 'Pessoa'
   6. Mudanças numa nova versão. O que ainda falta?
Outros artigos deste autor

Gerando gráficos com PHP e highcharts.com

Utilizando PHP e Apache para desligar um Ubuntu

Abordagem exemplificada à Orientação a Objetos com PHP

Macromedia Studio 8 no Wine em detalhes

Construindo componentes em PHP e jQuery

Leitura recomendada

Acessando o Twitter de 5 formas: protocolo HTTP, cURL, classe HttpRequest (PHP), função http_post_fields() do PHP ou PHP+libcurl

Compactador de URL utilizando manipulação de diretórios do Linux com PHP

Guia completo do Ocomon no Linux - Módulo cliente, abertura de ocorrência (exclusivo VOL)

Como atribuir notícias RSS ao seu site usando ATOM e PHP

Como programar com OOP em PHP, uma classe simples

  
Comentários
[1] Comentário enviado por removido em 18/08/2006 - 08:58h

Parabéns collapse pelo artigo bem explicado...
Acredito que ajudará iniciantes, e aqueles que ainda têm medo de migrar para o PHP5, a utillizarem cada vez mais essa versão...

E tomara que muita coisa melhore nas próximas versões do PHP. Como a manipulação de eventos (dito por você), e tipagem forte de atributos/métodos...

Uma outra funcionalidade que acho interessante seria a possibilidade de se criar propriedades, como o C# (DotNet).

Abraços,

[2] Comentário enviado por F4xl em 19/08/2006 - 01:07h

Muito bom o artigo, Evaldo!

Principalmente para quem está iniciando os estudos em PHP. Um comentário que eu gostaria de ler aqui é sobre como o PHP vai se comportar no mercado concorrendo com a plataforma .NET da Microsoft, uma vez que todos parecem querer migrar para ela.

Abraços a todos!

[3] Comentário enviado por evandrofisico em 19/08/2006 - 20:52h

Para fazer um destructor em php4 é necessária uma pequena gambiarra, colocando dentro da funcao constructor um register_shutdown_function(array(&$this, 'quit'))

onde quit é o nome da funcao a ser executada antes do fim do script

[4] Comentário enviado por rockedsonbr em 30/08/2006 - 11:43h

Muito bom....

Algumas dúvidas?
O método __destruct() tem q ser envocado após o uso da classe?

$myvar->__destruct();

Posso usar unset($myvar); isto já resolve???

Andei lendo alguns artigos e pessoas tem explicações diferentes... qual o mais indicado?

Abraço


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts