Andre Metzen


Framework mais que ágil

Publicado em Aplicativos Web,php por Andre Metzen, 24 de fevereiro de 2009

Já faz algum tempo que não posto por aqui, e acho que é melhor eu colocar alguma coisa antes de fazer aniversário de ausência nesse blog. :)

Como eu havia prometido para algumas pessoas, gravei um rápido (não tão rápido assim, tem 16min) screencast demonstrando alguns recursos do framework que estou trabalhando há algum tempinho. Não é nada revolucionário, mas com certeza pode ajudar e muito aqueles que querem criar aplicações web que não sejam muito complexas em pouquíssimo tempo (quanto me refiro a pouco tempo digo questão de minutos).

Vale lembrar que para não estender muito a duração do vídeo eu só demonstrei algumas poucas funcionalidades – se eu fosse mostrar tudo ia durar algumas horas – então quem tiver alguma dúvida, só entrar em contato.

Veja em uma resolução maior

Standard PHP Library – Parte 2

Publicado em php por Andre Metzen, 6 de março de 2008

Há algum tempo havia escrito sobre a SPL e fiquei por publicar outros artigos sobre o assunto. Infelizmente não consigo manter a regularidade de publicação que gostaria aqui no blog, mas vou indo na medida do possivel.

A partir da versão 5 do PHP a SPL já vem importada nativamente, o que facilita a utlização dos recursos que ela oferece. Desde então os desenvolvedores do PHP vem trabalhando pesado para melhorar o suporte a orientação a objetos. É claro que até lá ainda há um longo caminho a percorrer e isso requer um grande esforço de toda comunidade.

Isso certamente trará beneficios, tornando a linguagem mais madura, robusta, sem perder a simplicidade que a tornou tão popular. Há também os lados negativos, por exemplo a incompatibilidade de scripts desenvolvidos para versões anteriores, mas acredito que o "prejuizo" seja por uma boa causa. Já está na hora de resolvermos problemas de inconsistencia na padronização da nomeclatura das funções das bibliotecas nativas da linguagem (algumas utilizam o separador undescore como str_replace e outras não, como strlen), o que provoca em perda de produtividade.

A SPL veio com o objetivo de prover funcionalidades básicas, organizadas através de classes e interfaces, que evitam que o programador precise reinventar a roda e permitindo que ele possa focar suas atenções para a solução dos reais problemas. Nada pior do que perder horas para resolver problemas que foram criados pela própria linguagem.

A seguir demonstrarei como utilizar as classes de manipulação de arquivos SplFileInfo e SplFileObject.

SplFileInfo

Esta classe fornece todas as informações disponíveis para um determinado aquivo, passado como paramento na instanciação do objeto.

PHP:
  1. <?
  2. $file = new SplFileInfo("./meu_arquivo.txt");
  3. ?>

A partir disso, o objeto fornece os seguintes métodos:

  • getATime(): Data em timestamp do último acesso ao arquivo.
  • getCTime(): Data em timestamp da criação do arquivo.
  • getGroup(): Retorna o group do arquivo (disponível apenas em sistemas unix).
  • getInode(): Retorna o inode do arquivo (disponível apenas em sistemas unix).
  • getMTime(): Data em timestamp da última modificação do arquivo.
  • getPath(): Retorna o diretório no qual o arquivo está contido.
  • getPerms(): Retorna as permissões do arquivo.
  • getRealPath(): Retorna o caminho completo até o arquivo.
  • getSize(): Retorna o tamanho do arquivo em bytes.
  • isDir(): Retorna um valor booleano informando se o arquivo é do tipo diretório
  • isExecutable(): Retorna um valor booleando informando se o arquivo é um executável válido.
  • isFile(): Retorna um valor booleando informando se o arquivo é mesmo um arquivo, e não um diretório ou um link.
  • isLink(): Retorna um valor booleando informando se o arquivo é um link para outro arquivo ou diretório.
  • isReadable(): Retorna um valor booleando informando se o arquivo pode ser lido ou não.
  • isWritable(): Retorna um valor booleando informando se o arquivo pode ser alterado ou não.
  • openFile(): retorna um objeto do tipo SplFileObject, que será apresentado abaixo.

Estas funções fornecem os principais dados que podemos obter dos arquivos, e com certeza pode resolver muitos problemas. Principalmente as funções getMTime(), isWritable() e getSize() são comumente utilizadas no nosso dia-a-dia.

SplFileObject

Esta classe herda a classe SplFileInfo. Logo ela possui todas os métodos que a classe explicada acima possui, porém implementa também a manipulação do conteúdo do arquivo.

PHP:
  1. <?
  2. $file = new SplFileObject("./meu_arquivo.txt");
  3. ?>

Colocarei apenas os métodos mais importantes a seguir:

  • eof(): Retorna um valor booleando indicando se o ponteiro está no fim do arquivo.
  • fflush(): Força a escrita em disco do buffer do arquivo.
  • fgetc(): Retorna uma string contendo apenas um caracter lido do arquivo.
  • fgets(): Retorna uma linha do arquivo.
  • fscanf($format): Interpreta a leitura de um arquivo de acordo com o formato passado como parametro.
  • fseek($pos): Move o ponteiro do arquivo.
  • fstat(): Retorna um vetor com detalhes do arquivo.
  • ftell(): Retorna um inteiro com posição do ponteiro no arquivo.
  • ftruncate($size): Reduz o tamanho do arquivo ao tamanho especificado.
  • fwrite($string): Escreve o conteúdo da string no arquivo.
  • rewind(): Volta o ponteiro para o inicio do arquivo.
  • seek($line): Muda o ponteiro para linha especificada.

Estas funções são basicamente as funções oferecidas pela biblioteca atual do PHP, organizadas em objetos e permite a iteração já que esta classe também estende a interface Iterator. É importante relembrar também que estes métodos são nativos e tão eficientes quanto as funções já existentes.

Vale a pena dar uma conferida nas ferramentas oferecias pela SPL na sua oculta documentação.

Standard PHP Library

Publicado em php por Andre Metzen, 18 de outubro de 2007

A SPL (Standard PHP Library) é uma ferramenta ainda muito pouco conhecida do PHP. Um dos principais motivos disso é o fato de possuir pouca documentação oficial. Porém você pode encontrar a especificação completa escondida aqui.

Ela é basicamente um conjunto de classes e interfaces criadas para resolver problemas comuns e prover acesso eficiente a alguns tipos de dados. Como demonstração irei criar uma classe Collection, que será um conjunto de elementos quaisquer. Esse conjunto poderá ser acessado a principio como apenas como um vetor, e mais posteriormente publicarei outros artigos onde o tornarei mais poderoso.

PHP:
  1. <?
  2.  
  3. class Collection implements ArrayAccess
  4. {
  5.     protected $array = array();
  6.  
  7.     public function offsetExists($offset) // verifica se existe o elemento cujo indice é $offset
  8.     {
  9.         return isset($this->array[$offset]);
  10.     }
  11.    
  12.     public function offsetGet($offset) // retorna o elemento cujo indice é $offset
  13.     {
  14.         return $this->array[$offset];
  15.     }
  16.    
  17.     public function offsetSet($offset, $value) // atribui $value ao indice $offset
  18.     {
  19.         if ($offset)  $this->array[$offset] = $value;
  20.         else  $this->array[] = $value;
  21.     }
  22.    
  23.     public function offsetUnset($offset) // reseta o indice $offset
  24.     {
  25.         unset($this->array[$offset]);
  26.     }
  27. }
  28.  
  29. ?>

O "segredo" está na interface ArrayAccess, ela exige a implementação dos métodos offsetExists(), offsetGet(), offsetSet() e offsetUnset() que podem ser facilmente criados. Dessa forma podemos executar o seguinte código:

PHP:
  1. <?
  2.  
  3. $x = new Collection();
  4.  
  5. $x[0] = "Olá";
  6. $x[] = "Mundo!";
  7.  
  8. //echo implode(" ", $x); // isso não funciona pois o tipo do objeto $x não é um vetor
  9. //echo count($x); // isso também não funciona pois $x não é "contavel"
  10. echo $x[0]." ".$x[1];
  11.  
  12. ?>

Agora precisamos de mais um recurso muito importante: poder contar quantos elementos há nesta Collection, já que não podemos ter acesso externo a propriedade Collection::array. Basta adicionar a interface Countable e adicionar o método count().

PHP:
  1. <?
  2.  
  3. class Collection implements ArrayAccess, Countable
  4. {
  5.     protected $array = array();
  6.  
  7.     ...
  8.  
  9.     public function count()
  10.     {
  11.         return count($this->array);
  12.     }
  13. }
  14.  
  15. ?>

Agora podemos percorrer o vetor em um for:

PHP:
  1. <?
  2.  
  3. $x = new Collection();
  4.  
  5. $x[] = 1;
  6. $x[] = 2;
  7. $x[] = 4;
  8. $x[] = 8;
  9.  
  10. for($i=0; $i<count($x); $i++) // agora funciona!
  11. {
  12.     echo $x[$i]."\n";
  13. }
  14.  
  15. ?>

Bom, vou ficando por aqui, em breve escreverei um pouco mais sobre a SPL e mostrarei alguns exemplos úteis desse recurso.

Abraços!