Mostrando postagens com marcador php. Mostrar todas as postagens
Mostrando postagens com marcador php. Mostrar todas as postagens

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!



sábado, 8 de setembro de 2012

PHP como CGI ou como módulo de Apache

A diferença do PHP como CGI do apache é que ele é configurado como um "assistente" e assim é menos propício à problemas, porém menos seguro tb.

Já o PHP como módulo do apache, vira uma extensão do WebSever(no caso apache), habilitando mais opções, módulos e etc, é mais seguro, porém o risco de problemas é maior.



Basicamente a diferença é Speed and Power, os sites normalmente instalam o PHP como modulo do webserver (Apache, Nginx...)

Mais:

Installed as CGI binary [ca.php.net
Installed as an Apache module [ca.php.net]

terça-feira, 28 de agosto de 2012

Sprintf no PHP

Essa é para vc que é novo no PHP ou que pretende tirar a certificação ZCE e esta com receio sobre umas funções pouco usadas em seu dia a dia... O sprintf é uma delas.... Opa opa espera ai? O sprintf não é um printf? Sim, mas printf "echoa" o resultado, enquanto que sprintf retorna. 

Então significa que entendendo o printf eu vou entender o sprintf?
 Sim! 

Vamos ao entendimento então!


 A função recebe basicamente 2 argumentos, o primeiro é o formato que a string deve aparecer e o segundo a própria string, por exemplo:

printf("Eu tenho %d anos", 23);  


Veja que %d representa um valor inteiro, se você tentar usar uma float ou um real ele não irá funcionar, veja uma tabela com alguns dos tipos aceitos:

TipoDescrição
%bArgumento considerado um inteiro; apresentado com um numero binário
%cArgumento considerado um inteiro; apresentado com um valor correspondente em ASCII
%dArgumento considerado um inteiro; apresentado com um numero decimal
%fArgumento considerado numero de ponto flutuante; apresentado com um numero de ponto flutuante
%oArgumento considerado um inteiro; apresentado com um numero octal
%sArgumento considerado um string; apresentado com um numero string
%uArgumento considerado um inteiro; apresentado com um numero decimal não assinado
%xArgumento considerado um inteiro; apresentado com um numero hexadecimal em letras minusculas
%XArgumento considerado um inteiro; apresentado com um numero hexadecimal em letras maiusculas


Caso você queira utilizar mais de um valor pode passa os argumentos separados por virgulas repeitando a sequencia que foram declarados:
  1. <?php 
  2.     printf("Eu sou o %s e tenho %d anos""PV", 23);  
  3. ?>  
Legal e tudo isso pode ser aplicado com o sprintf ? Sim, mas lembre-se, ele retorna o valor e não imprime.


Tudo muito legal não é? Se vc veio aqui para garantir que esta pronto para ZCE então lá vai um QUIZ tipico da prova para vc responder:


What will the following code print out?
  1. <?php  
  2.     echo sprintf('"%4d"', ord('a'));  
  3. ?>  
E ai sabe a resposta? Em breve eu coloco aqui, com uma explicação.
[Resposta: " 97"]
[Explicação:  No format o número 4 representa um espaço em branco(a equerda pq é positivo, se negativo seria a direita) as aspas são apenas para exibir o d e o % vc ja conhece e por fim a função ord() retorna o valor ASCII do caracter, e o valor ASCII de
a é = 97]

quinta-feira, 16 de agosto de 2012

Type Hinting no PHP

Olá amigos tudo bem? Hoje serei breve (acho que essa frase virou prefixo dos meus ultimos posts... Oo)




Bem vamos lá....

                                 TYPE HINTING


A partir do PHP 5.0 foi introduzido o Type Hinting, mesmo sendo relativamente velho as pessoas não sabem o que é pois bem, traduzindo Type Hinting é "Indução de Tipo". Particularmente eu não gosto das traduções ao pé da letra pois no mundo da TI isso mais atrapalha do que ajuda, mas nesse caso a tradução ao pé da letra vai ajudar e muito então vamos fazer uma "análise sintática"
da tradução!




Indução de tipo, indução -> alguém está induzindo algo e tipo, esse algo é o tipo. Agora, pesquisando em que contexto isso se refere nós podemos entender que indução de tipo é uma função dizer qual tipo ela recebe, mais o menos assim:
 Exemplo type hinting
  1. /* Type Hinting */
  2. function insereLista(\Lib\Nucleo\Pessoa $pessoa){
  3.         /*
  4.         * inserindo na lista....
  5.         */
  6. }



Temos a função insereLista que recebe um parametro $pessoa... mas o que é esse pessoa? Antes do parametro colocamos a classe em que esse parametro é uma instância dizendo para a função o tipo do parametro. Ficando mais coeso o código e ainda bem fácil de dar manutenção.

Legal é só isso? Funciona com tipo primitivo? :D

Não!

O Type Hinting foi introduzido no PHP 5.0 para objetos e 5.1 para arrays os tipos escalares ainda não é nativo mas, caso vc queira usa-los é necessário o uso da extensão SPL_Types que vc pode ver aqui




PS: Não confundam isso com CAST... não tem nada haver satangoss nessa ideia ai heinn?!


so.... fui.

Mais? php.net