Back-End

19 out, 2010

Magic Methods PHP 5 – Orientação a Objetos com PHP + CodeIgniter

Publicidade

Algum tempo atrás lí a seguinte frase:

“Programação OO em PHP está se resumindo a programação orientada a métodos”

Não lembro mais onde vi isso (se alguém souber, me avise), mas essa frase me impactou para uma reflexão sobre os códigos que vinha e venho escrevendo em PHP.

Salvo pelo uso de frameworks que acabam inevitavelmente herdando características e métodos de suas classes principais, muitos scripts PHP acabam se tornando um agrupamento de métodos e funções agregados em uma classe.

Criar uma classe simplesmente para dar include em arquivos externos ou chamar funções não é orientação a objetos.

Este artigo objetiva apresentar de uma forma bastante simplificada a representação de uma classe pessoa através da criação de dois objetos pessoa distintos aplicando esta metodologia ao framework CodeIgniter.

Desta forma teremos um controlador chamado pessoa que é também a nossa classe e uma view para apresentar os dados. Tudo muito simples.
O foco do artigo está nos “Magic Methods” do PHP5. Vamos utilizar apenas 3 dos 14 Magic Methods num primeiro momento, o __get(),o __set() e o __construct. Em uma continuação trabalharemos com os demais médotos.

Neste primeiro artigo não apresentarei a abstração da classe, para que fique o mais simples possível. No segundo faremos a abstração e uso de Interface.

O PHP não permite herança multipla, por isto não poderemos herdar propriedades de mais de uma classe, e como nossa classe pessoa já herda as propriedades de controller precisaremos criar nossa classe pessoa seguindo o modelo real de uso, ou seja, a representação da nossa classe concreta.

Vamos ao código do controlador pessoa.php

<?php
class Pessoa extends Controller {

private $nome;
private $cpf;
private $sexo;

function __construct()
{
parent::Controller();
}

public function __set($campo,$valor){
$this->$campo = $valor;
}

public function get($campo){
return $this->$campo;
}

function index()
{
$data = array();

$joao = new pessoa();
$joao->nome = "JOAO";
$joao->sexo = "M";
$joao->cpf = "123.456.789-00";

$leticia = new pessoa();
$leticia->nome = "LETICIA";
$leticia->sexo = "F";
$leticia->cpf = "987.654.321-99";

$data['joao']['nome'] = $joao->nome;
$data['joao']['sexo'] = $joao->sexo;
$data['joao']['cpf'] = $joao->cpf;

$data['leticia']['nome'] = $leticia->nome;
$data['leticia']['sexo'] = $leticia->sexo;
$data['leticia']['cpf'] = $leticia->cpf;

$this->load->view('pessoa',$data);
}
}

O importante a observar neste código é que estamos utilizando o __construct() e não repetindo o nome da classe para o construtor, igualmente também poderemos ter um método __destruct() que, por exemplo, poderia limpar uma sessão de login após o envio de uma determinada mensagem ou limpar um carrinho de compras ao final do seu processamento.

E o não menos importante, os métodos __get() e __set() que permitem ajustarmos e recuperarmos qualquer atributo público da classe sem a necessidade de construir os “getters” e “setters” um a um.

Isto faz com que possamos acessar atributos privados de nossas classes de maneira mais segura e semântica e com muito menos trabalho. Da para perceber que o PHP fica a cada dia mais parecido com o Java e o C# neste sentido, reservadas as proporções.

Vamos às explicações:

O método mágico __set().

public function __set($campo,$valor){
        $this->$campo = $valor;
 }

É muito simples de compreender de que forma estamos acessando cada atributo, ao receber dois parâmetros sendo o primeiro o atributo e o segundo o valor atribuído, o método ajusta automaticamente estes valores.

E isto é acessado no seguinte código.

$joao->nome = "JOAO";

O método __get é ainda mais simples pois apenas retorna o valor de um atributo, onde this é o próprio objeto concreto, a instância da classe, apontando para o valor atribuído aquela variável.

public function get($campo){
return $this->$campo;
}

Ou seja para recuperar um valor basta apontar para ele da seguinte maneira.

$joao->nome;

Levando em consideração que $joao é a instância do objeto e não a classe em si.

Acompanhem os próximos artigos para ver como fica a abstração da classe pessoa e o estudo dos demais métodos mágicos do PHP 5.