terça-feira, 11 de setembro de 2012

Contando objeto no PHP

... Eis que surge a dúvida, como eu conto os atributos de um objeto? Será que count/sizeof funciona? Vamos testar?

Criando uma classe pessoa com os atributos nome, sexo e idade:
 CLASSE PESSOA
  1. class Pessoa{
  2.    
  3.     private $nome;
  4.     private $sexo;
  5.     private $idade;
  6.    
  7.     public function getNome() {
  8.         return $this->nome;
  9.     }
  10.     public function setNome($nome) {
  11.         $this->nome = $nome;
  12.     }
  13.     public function getSexo() {
  14.         return $this->sexo;
  15.     }
  16.     public function setSexo($sexo) {
  17.         $this->sexo = $sexo;
  18.     }
  19.     public function getIdade() {
  20.         return $this->idade;
  21.     }
  22.     public function setIdade($idade) {
  23.         $this->idade = $idade;
  24.     }
  25.    
  26. }

Vamos criar uma instância dessa classe e popular ela, depois utilizamos o count na busca de um resultado mágico ok?
tentando contar atributos de um objeto
  1. $pv = new Pessoa();
  2. $pv->setNome("Paulo Victor");
  3. $pv->setSexo("M");
  4. $pv->setIdade("23");
  5. echo sizeof($pv);
E ai o que ele vai retornar? Nesse caso retorna 1 pois o objeto é válido e ponto. (If you try to do a sizeof or count with an object, it will always return 1 if the object is not null)

OBS: sizeof é um atalho para a função count


I ai ferro, será que tem algo específico para contar um objeto?






..... Pesquisando e pesquisando descobrimos que a melhor solução nesse caso é fazer um cast do objeto para array, juro, dentro do count isso é lindo, assim como diz na documentação do php veja:
You need to type cast the object as an array for it to count correctly. (fonte: http://www.php.net/manual/en/function.count.php)

Então ficaria assim:

 contaNDO atributos de um objeto
  1. $pv = new Pessoa();
  2. $pv->setNome("Paulo Victor");
  3. $pv->setSexo("M");
  4. $pv->setIdade("23");
  5. echo sizeof((array) $pv); // 3
Pronto, a saída disso será 3, o número de atributos.


Que simples não é? Igual a epoca em que jogavamos Alex kidd(foto, graaande alex kidd)

Pois bem, ai talvez vc me faça uma pergunta(diga-se de passagem, muito inconveniente kkkk) se não existem forma de tornar a contagem mais lógica de objetos, e ai amiguinho eu te dou uma resposta de alto nível que é; O PHP se preparou para tudo(quase tudo) e para esses casos existe a interface ArrayAccess que permite vc manipular objetos como array e array o PHP já tem 321402342034923049203492304 funções.
 Mas, esse é um assunto para o próximo artigo(que eu juro q vou falar sobre). 



Agora se vc quer contar exatamente um atributo e não quer ter muito trabalho eu idico dar uma lida na interface Countable da SPL(uma biblioteca com diversas classe e interfaces para PHP, que vão desde estruturas de dados, implementações de Design patterns, Iterators, Exceptions e funções diversas) aqui no blog do Thiago Rigo tem uma boa explicação sobre ela http://thiagorigo.com/blog/2010/07/spl-countable/

Então é isso. Valeu!



2 comentários:

  1. Otimo post Paulo, a forma q vc aborda uma questão torna o assunto agradavel, parabéns

    ResponderExcluir
  2. E eu que achava que alex kidd era difícil!!! Brincadeira, mandou bem. Congrats!

    ResponderExcluir