Classes e Objetos (PHP5) - Visibilidade, Construtores e Destrutores
por John Marques

Neste artigo ensino o que é e como funciona a visibilidade, os construtores e destrutores dentro de promação orientada à objetos no PHP5.



Nesse artigo falarei sobre Visibilidade, Construtores e Destrutores, tambem falarei sobre outras coisas relacionadas, usarei um único código como exemplo e tentarei detalhar o máximo possível.

Primeiro irei falar sobre os conceitos..

Visibilidade

O PHP5 podemos determinar a visibilidade dos Membros ou dos Métodos, simplesmente prefixando com as palavras-chave:

public:
Os items declarados como public podem ser acesso por qualquer um, podendo ser acessado pela própria classe, pela classe de herança e pelo objeto.

protected:
Esta determina que o item será acesso apenas pela classe que criou o item e pela classe que recebe a herança.

private:
Esta palavra-chave permite que somente a classe criadora do item possa acessa-lá.

Nota:
"O uso da declaração de variável com a palavra-chave "var" não é mais válida para objetos do PHP 5. Para compatibilidade, presumirá-se que uma variável declarada no php tenha visibilidade public, e um aviso E_STRICT será mostrado na tela." (manual do PHP)




Construtores

Ele é usado quando se inicializa um objeto, até antes do PHP5, o construtor era um método com o mesmo nome da classe, no PHP5 é usado o método __construct, mas o interessante é o seguinte, vamos supor que a classe que a pessoa criou não exista o método __construct, ai então o php faz como no PHP4, irá procurar um método com o mesmo nome da classe.

O construtor serve para inicializar comandos que o programador deseje, mais abaixo ficará claro no código.


Destrutores

Este método foi inserido no PHP5, vem com um conceito similar à outras linguagens orientadas a objetos, como o java.

"Os destrutores são funções que se encarregam de realizar as tarefas que se necessita executar quando um objeto deixa de existir. Quando um objeto já não está referenciado por nenhuma variável, deixa de ter sentido que esteja armazenado na memória, portanto, o objeto deve ser destruído para liberar seu espaço. No momento de sua destruição, a função se chama destrutor, que pode realizar as tarefas que o programador estime oportuno realizar.

A criação do destrutor é opcional. Somente devemos criá-lo, se desejarmos fazer alguma coisa quando um objeto se elimine da memória." (CriaWeb)



Então tá agora que sabemos dos conceitos vamos para o código.


<?php
class operacoes
{
    
// Membros
    // aqui declaramos os tipos dos membros
    
public $v1;
    
public $v2;
    
protected $res;
    
    
/*
    Construtor:
    Nele setamos os valores dos membros de $v1 e $v2 
    */
    
function __construct()
    {
        
$this->setV1(10);
        
$this->setV2(3);
    }
    
    
//Destrutor
    
function __destruct()
    {
        echo 
"eu sou um destrutor";
    }
    
    
//Um método
    
public function soma()
    {
        return 
$this->res $this->v1 $this->v2;
    }
    
    
/*
    Observe que na função subtração eu não uso a palavra-chave 
    public, pois o PHP5 entende que qualquer método que não 
    seja setado sua visibilidade terá como visão total ou seja 
    será "public", então tanto faz colocarmos public ou não 
    colocar nada na frente de um método que vai dar na mesma, 
    ja no caso do protected e private é necessário que seja setado.
    */
    
function subtracao()
    {
        return 
$this->res $this->v1 $this->v2;
    }
    
    
protected function multiplicacao()
    {
        return 
$this->res $this->v1 $this->v2;
    }
    
    
protected function divisao()
    {
        return 
$this->res $this->v1 $this->v2;
    }
    
    
// Privamos o método para o uso somente da classe operacoes.
    
private function modulo()
    {
        return 
$this->res $this->v1 $this->v2;
    }
    
    
public function ret_modulo()
    {
        return 
$this->modulo();
    }
    
    
public function setV1($valor)
    {
        
$this->v1 $valor;
    }
    
    
public function setV2($valor)
    {
        
$this->v2 $valor;
    }
    
    
public function getV1()
    {
        return 
$this->v1;
    }
    
    
public function getV2()
    {
        return 
$this->v2;
    }
}
?>


Crie duas classes para explicar a visibilidade dos métodos pois se fosse somente explicado a visiblidade dos membros, era necessário somente a classe operacoes.


<?php
class exec_op extends operacoes
{
    
//determino o membro como privado
    
private $r;
    
    function 
__construct()
    {
        
//o comando abaixo determina que o construtor da classe
        //pai deve ser usado
        
parent::__construct();
    }
    
    function 
__destruct()
    {
        
//Da mesma forma que no construtor desta classe..
        //o destrutor do pai deve ser usado
        
parent::__destruct();
    }
    
    
public function print_soma($v1 ""$v2 "")
    {
        if (
$v1 != "") {
            
$this->setV1($v1);
        }
        
        if (
$v2 != "") {
            
$this->setV2($v2);
        }
        
        
$this->$this->soma();
        
$this->imp();
    }
    
    
public function print_modulo($v1 ""$v2 "")
    {
        if (
$v1 != "") {
            
$this->setV1($v1);
        }
        
        if (
$v2 != "") {
            
$this->setV2($v2);
        }
        
        
$this->$this->ret_modulo();
        
$this->imp();
    }
    
    
public function imp()
    {
        echo 
$this->r."<br>";
    }
}

$exec = new exec_op();

// Retornará 13
$exec->print_soma();

//Retornará 1
$exec->print_modulo();

// Gera um erro "Fatal error: Call to private method 
// operacoes::modulo() from context '' in operacoes.php on line xx"
echo $exec->modulo();

// Gera um erro "Fatal error: Call to protected method
// operacoes::divisao() from context '' in operacoes.class.php on line xx"
echo $exec->divisao();

// Retornará 7
echo $exec->subtracao();

// Gera um erro "Fatal error: Call to protected method 
// operacoes::multiplicacao() from context '' in operacoes.class.php on line 122
echo $exec->multiplicacao();
?>


Galera muito obrigado. Tomara que eu tenha ajudado, eu acredito que este artigo serve para ajudar aqueles que estão iniciando em OOP no PHP5.

Abraço a todos,
John Marques