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.