sábado, 14 de julho de 2012

SPL PHP

Se você nem imagina o que significa SPL no PHP é provavel que você veio aqui por culpa da certificação da ZEND (pois SPL esta no edital da prova), e eu já vou adiantando que você se deu muito bem pois a ideia é justamente esclarecer o SPL para vc aprender e ir bem na certificação!

SPL significa Standard PHP Library  que é uma coleção de interfaces e classes que servem para resolver problemas padrões da orientação a objetos no PHP.
Em resumo SPL fornece um conjunto padrão de interfaces para PHP5. O objetivo do SPL é implementar algumas interfaces de dados eficientes de acesso e classes para PHP. Funcionalmente ele é projetado para percorrer estruturas agregadas (qualquer coisa que você quer varrer). Estes podem incluir matrizes, conjuntos de resultados de banco de dados, árvores xml, listas de diretório ou de qualquer lista em tudo. Atualmente SPL lida com iteradores.


Agora você pensa: Legal, mais onde isso exatamente me ajuda? Eu sei que ver o Homer aqui comemorando é muito legal mas eu quero uma finalidade para a SPL... 

E ai eu te digo, vou repetir mais com outras palavras a explicação.... o SPL são interfaces e classes nativas do PHP que tem o intuito de resolver problemas que ocorrem com frequencia no desenvolvimento, como por exemplo uma interação de arrays e etc...

Agora melhorou né? Mais como funciona?... A SPL é dividida em categorias de acordo com a funcionalidade.

Eu não vou ficar escrevendo TUDO aqui pois seria replicar o que existe na documentação do PHP, mais vou dar um copy paste de uma classe que é a ArrayIterator, veja como é util.


A classe ArrayIterator

Introdução

Este iterator permite remover e modificar valores e chaves quando iterando arrays e objetos.
Quando você quiser iterar o mesmo array múltiplas vezes você precisa instanciar ArrayObject e criar instâncias de ArrayIterator que é consultado usando foreach ou chamando o método getIterator() manualmente.

Sinopse da classe

ArrayIterator implements Iterator , Traversable , ArrayAccess , SeekableIterator , Countable {
/* Métodos */
public void append ( mixed $value )
public void asort ( void )
public __construct ([ mixed $array = array() [, int $flags = 0 ]] )
public int count ( void )
mixed current ( void )
public array getArrayCopy ( void )
public void getFlags ( void )
mixed key ( void )
public void ksort ( void )
public void natcasesort ( void )
public void natsort ( void )
void next ( void )
public void offsetExists ( string $index )
public mixed offsetGet ( string $index )
public void offsetSet ( string $index , string $newval )
public void offsetUnset ( string $index )
void rewind ( void )
void seek ( int $position )
public string serialize ( void )
public void setFlags ( string $flags )
public void uasort ( string $cmp_function )
public void uksort ( string $cmp_function )
public string unserialize ( string $serialized )
bool valid ( void )
}

Seus métodos e funcionalidade


Informações completas sobre a a classe?
o PHP tem uma das melhores documentações do mundo, então é só acessar. 
http://www.php.net/manual/pt_BR/book.spl.php

Valeu!

quarta-feira, 11 de julho de 2012

Autoload no PHP 5

Olá amigos tudo bem? Hoje vou falar de forma básica sobre o autoload no PHP.

Não vou entrar no mérito de discutir o pq do autoload pois se vc veio aqui é pq sabe ou tem ideia da sua utilização. Para evitarmos o uso de include manualmente a partir do PHP 5 foi disponibilizado o autoload que é basicamente uma forma de carregarmos a classe que precisamos. Mais como funciona?


A partir fo PHP 5, basta definir uma função __autoload no inicio do script que ela é automaticamente chamada quando tentamos usar uma classe.
Dessa forma:

<?php
function __autoload($class_name){
        require_once $class_name . '.php';
    }
   
    $pessoa = new Pessoa();
    $pessoa->setNome($nome);
?>

Basicamente a classe carregaria automaticamente e não precisamos ficar chamando o __autoload pois ele é carregado automaticamente. Que artigo mais basico e rápido esse não é? Bem, essa é a ideia hehe.


quinta-feira, 5 de julho de 2012

Reflection no PHP

Olá amigos e amigas tudo bem? Espero que sim =) ... Hoje vou falar rapidamente do Reflection no PHP... Reflection? 



O que é isso? A partir do PHP 5 foi implementado uma API chamada Reflection. Ela permite fazermos reflexão de objetos, ou seja, observar a estrutura de classes como seus métodos, atributos, interfaces... tudo em tempo de execução (runtime). Basicamente a reflexão de um objeto permite que ele se observe, como nós olhando em um espelho.

Ta, mais e como posso fazer um teste disso? Simples, vamos utilizar a ReflectionClass afim de exibir sua funcionalidade.




  1. <?php
  2. class Pessoa{
  3.    
  4.     private $nome;
  5.     private $sexo;
  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.    
  20. }
  21. $reflection = new ReflectionClass('Pessoa');
  22. var_dump($reflection->getMethods());

Veja que criamos uma classe pessoa com 2 atributos, nome e sexo e os sets e gets dessa classe... depois criamos uma instancia da ReflectionClass passando a classe Pessoa como argumento e utilizamos o metodo getMethods para buscar os mesmos... o resultado disso?



  1. array(4) { [0]=> &object(ReflectionMethod)#2 (2) { ["name"]=> string(7) "getNome" ["class"]=> string(6) "Pessoa" } [1]=> &object(ReflectionMethod)#3 (2) { ["name"]=> string(7) "setNome" ["class"]=> string(6) "Pessoa" } [2]=> &object(ReflectionMethod)#4 (2) { ["name"]=> string(7) "getSexo" ["class"]=> string(6) "Pessoa" } [3]=> &object(ReflectionMethod)#5 (2) { ["name"]=> string(7) "setSexo" ["class"]=> string(6) "Pessoa" } }

Esse foi o resultado, conseguimos "dissecar" a classe facilmente... bom não é? Eu tenho certeza que se é a primeira vez que vc lê sobre reflection vc esta com mt raiva... Mais vou amenizar isso sem te oferecer um suco de maracuja.

Onde utilizamos o reflection?
As opções são várias para utilizar o REFLECTION mais eu vou me conter apenas a falar sobre onde já é bem utilizado...

Vc já ouviu falar sobre ORM? Se sim então provavelmente conhece o DOCTRINE framework ORM para PHP não é? Veja bem, o DOCTRINE utiliza reflection nas entidades que escrevemos para poder gerar o SQL e criar/sincronizar nossas classes com o banco, assim não precisamos ficar criando scripts SQL sempre que mudarmos a estrutura do nosso banco basta sincronizar e quem faz essa brincadeira é o DOCTRINE utilizando o REFLECTION do PHP...

O BOUML um software para UML faz uma engenharia reversa do nosso código PHP para diagramas e como vc acha que ele faz isso? Mágica? Não, ele usa o reflection... São 'n' as possibilidades para o uso do reflection então se pintar uma ideia insana para uma aplicação sua e vc achar que ela é impossível pela limitação da tecnologia.... pare, pense, pesquise e implemente! :)

Espero ter ajudado!


=]


segunda-feira, 2 de julho de 2012

DateTime do PHP

A partir do PHP 5.2.0, há uma maneira nativa e simples de se trabalhar com horários e datas, com auxílio da classe DateTime Link Externo.

O objetivo do artigo é mostrar algumas das utilidades da classe DateTime. 

Sumário
1. Construtor da classe
2. Formatando datas
3. Adicionando períodos a datas
4. Subtraindo períodos de uma data
5. Calculando diferença entre datas
6. Modificando a data e a hora do objeto


1. Construtor da classe

Sintaxe do construtor:
DateTime::__construct ([ string $time = "now" [, DateTimeZone $timezone = NULL ]] )
O método aceita dois parâmetros, ambos opcionais. O primeiro é a data/hora, no mesmo formato aceito pela função strftime() Link Externo. O segundo consiste no timezone que deve ser utilizado. Ele deve ser uma instância da classe DateTimeZone Link Externo. Uma outra maneira de definir o timezone é por meio da função date_default_timezone_set() Link Externo.
Ambas as classes DateTime e DateTimeZone disparam uma exceção se seus construtores receberem parâmetro inválidos. Logo, podemos usar blocos try/catch para instanciar essas classes.
try
{
 $DateTime = new DateTime( 'now', new DateTimeZone( 'America/Sao_Paulo') );
}
catch( Exception $e )
{
 echo 'Erro ao instanciar objeto.
';
 echo $e->getMessage();
 exit();
}
Experimente trocar o "now" por um valor não aceito pelo método, como uma string qualquer. Uma exceção será disparada.

2. Formatando datas

Para formatar datas, utilizamos o método format, que aceita um parâmetro, correspondente a uma formatação de data aceita pela função date() Link Externo.
$DateTime = new DateTime();
echo $DateTime->format( "d/m/Y H:i:s" ) . ' '; echo $DateTime->format( "Y-m-d H:i:s" ) . ' '; echo $DateTime->format( "Y/m/d H:i:s" ) . ' ';

 

3. Adicionando períodos a datas

Com o método add(), podemos adicionar períodos à data salva no objeto DateTime. É possível adicionar períodos de dias, períodos de tempo ou ambos, seguindo a formatação aceita pelo método, que recebe um único parâmetro, o qual é uma instância da classeDateInterval Link Externo, responsável por manipular os dados do período especificado.
Os períodos são especificados da seguinte maneira: períodos de dias são precedidos pela letra "P", seguidas de inteiros e seus respectivos identificadores de tempo ("D" para dias, "M" para meses e "Y" para anos). Períodos de tempo são precedidos pela letra "T" e seguidos de inteiros e seus respectivos identificadores de unidade ("H" para horas, "M" para minutos e "S" para segundos).
$DateTime = new DateTime();
$DateTime->add( new DateInterval( "P30D" ) ); // adiciona 30 dias echo $DateTime->format( "d/m/Y" ) . ' ';
$DateTime->add( new DateInterval( "P2M" ) ); // adiciona 2 meses echo $DateTime->format( "d/m/Y" ) . ' ';
$DateTime->add( new DateInterval( "P5Y" ) ); // adiciona 5 anos echo $DateTime->format( "d/m/Y" ) . ' ';
$DateTime->add( new DateInterval( "P5Y2M30D" ) ); // adiciona 30 dias, 2 meses e 5 anos echo $DateTime->format( "d/m/Y" ) . ' ';
Note que cada adição é feita com base na adição anterior, uma vez que cada soma modifica a data armazenada no objeto.

 

4. Subtraindo períodos de uma data

O método sub funciona da mesma forma que o add, com a mesma lista de parâmetros, mas, logicamente, em vez de adicionar períodos, ele os subtrai.
$DateTime = new DateTime();
$DateTime->sub( new DateInterval( "P30D" ) ); // subtrai 30 dias echo $DateTime->format( "d/m/Y" ) . ' ';
$DateTime->sub( new DateInterval( "P2M" ) ); // subtrai 2 meses echo $DateTime->format( "d/m/Y" ) . ' ';
$DateTime->sub( new DateInterval( "P5Y" ) ); // subtrai 5 anos echo $DateTime->format( "d/m/Y" ) . ' ';
$DateTime->sub( new DateInterval( "P5Y2M30D" ) ); // subtrai 30 dias, 2 meses e 5 anos echo $DateTime->format( "d/m/Y" ) . ' ';

 

5. Calculando diferença entre datas

Usando o método diff, podemos calcular o intervalo entre duas datas, com precisão de dias, meses, anos, horas, minutos e segundos. Esse método retorna uma instância da classe DateInterval, já citada anteriormente neste artigo.
$DateTime = new DateTime();
$diff = $DateTime->diff( new DateTime( '2009-02-14' ) );
echo "Diferença de: " . $diff->d . " dias " . $diff->m . " meses " . $diff->y . " anos " . $diff->h . " horas " . $diff->i . " minutos " . $diff->s . " segundos ";

 

6. Modificando a data e a hora do objeto

Para modificar a data e a hora armazenadas no objeto, utilizamos os métodos setDate esetTime.
$DateTime = new DateTime();
echo $DateTime->format( "d/m/Y H:i" ) . ' ';
$DateTime->setDate( 2007, 07, 07 ); $DateTime->setTime( 07, 27 );
echo $DateTime->format( "d/m/Y H:i" ) . '
';




Atenção amigos. Esse artigo não é meu mas sim do Roberto Beraldo Chaiben e o link original é: http://helpmasters.com.br/artigo/92/php-usando-a-classe-nativa-datetime
 Estou reproduzindo pois achei o artigo muito util e assim eu também não perco ele por ai! Todos os créditos ao escritor pelo otimo artigo.