Framework mais que ágil
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.
Standard PHP Library – Parte 2
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.
-
<?
-
$file = new SplFileInfo("./meu_arquivo.txt");
-
?>
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.
-
<?
-
$file = new SplFileObject("./meu_arquivo.txt");
-
?>
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
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.
-
<?
-
-
class Collection implements ArrayAccess
-
{
-
-
public function offsetExists($offset) // verifica se existe o elemento cujo indice é $offset
-
{
-
}
-
-
public function offsetGet($offset) // retorna o elemento cujo indice é $offset
-
{
-
return $this->array[$offset];
-
}
-
-
public function offsetSet($offset, $value) // atribui $value ao indice $offset
-
{
-
if ($offset) $this->array[$offset] = $value;
-
else $this->array[] = $value;
-
}
-
-
public function offsetUnset($offset) // reseta o indice $offset
-
{
-
}
-
}
-
-
?>
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:
-
<?
-
-
$x = new Collection();
-
-
$x[0] = "Olá";
-
$x[] = "Mundo!";
-
-
//echo implode(" ", $x); // isso não funciona pois o tipo do objeto $x não é um vetor
-
//echo count($x); // isso também não funciona pois $x não é "contavel"
-
-
?>
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().
Agora podemos percorrer o vetor em um for:
-
<?
-
-
$x = new Collection();
-
-
$x[] = 1;
-
$x[] = 2;
-
$x[] = 4;
-
$x[] = 8;
-
-
for($i=0; $i<count($x); $i++) // agora funciona!
-
{
-
}
-
-
?>
Bom, vou ficando por aqui, em breve escreverei um pouco mais sobre a SPL e mostrarei alguns exemplos úteis desse recurso.
Abraços!