Frameworks para Rich Internet Applications

Olá a todos. Neste artigo gostaria de compartilhar minha experiência com frameworks Rich Internet Application (RIA), o que pode ajudar quem está querendo melhorar a User Interface (UI) de suas aplicações web mas não sabe muito bem qual framework escolher dentre a grande variade disponível. Todo conteúdo deste artigo é uma opinião pessoal, não quero que achem que sou o dono da verdade, apesar de defender a minha escolha com relação a frameworks RIA, cabe a cada um pesquisar bem as alternativas e escolher o que mais se adapta à sua realidade.

JQuery

Uma das minhas primeiras experiências com RIA foi utilizando Jquery e sua extensão Jquery UI que fornece diversos componentes RIA para as aplicações. Jquery é conhecida por ser simples, altamente extensível e por ter diversos recursos e plugins, além de uma comunidade forte e ativa. A Jquery UI possui bons componentes para deixar as aplicações mais bonitas e amigáveis, ela também possui um framework CSS muito consistente, o que facilita a criação de temas para seus componentes, porém ela não tem uma boa abrangência das necessidades de sistemas, como, por exemplo, a falta de uma Grid e de uma Toolbar, além de outros componentes é claro. Isso mostra que o framework ainda tem muito o que crescer, apesar disso ele está num ótimo caminho e tem se mostrado muito promissor.

Com a falta destes componentes é necessário procurar componentes fornecidos via plugins, o problema disso é que nem sempre é uma solução consistente, de fácil extensibilidade e customização, um exemplo disso é com relação a Grid, existem opções disponíveis, porém boa parte está em beta ou alpha, e para customizar o componente é necessário um belo estudo em toda estrutura que o desenvolvedor definiu. Existem proposals para que próximas releases da Jquery UI agreguem estes componentes, porém será que seu projeto pode esperar até estas releases?

A Jquery pode ser uma boa opção se a equipe possui tempo disponível para customizar os componentes ou se sua aplicação não necessita de grandes alterações no visual do tema e dos componentes externos adotados. O framework é de fácil aprendizado, portanto isso seria um bom diferencial quanto a outros frameworks Javascript.

ExtJS

ExtJS é um framework Javascript com uma gama enorme de widgets para aplicações web. Existem diversos temas prontos, alguns fornecidos pelo próprio site da ExtJS e outros facilmente encontrados pela internet, além da flexibilidade fornecida pelo framework, para a extensão dos widgets já prontos. Segundo o site da ExtJS, os widgets seguem estritamente os padrões web e os temas prontos fornecem um bom suporte a diversos browsers, como IE, Firefox e Opera, dentre outros. Acredito que a principal vantagem deste framework é a quantidade de componentes que ele possui, é extremamente raro existir a necessidade de se implementar um novo componente do zero.

Além desta gama de componentes, as funcionalidades da ExtJS também são bem completas. O framework fornece funcionalidades para utilização de AJAX, para manipulação de DOM, para extensão de componentes, para armazenar fontes de dados (datasources), templates para apresentação de dados, etc. É um framework realmente completo, o que é possível de se perceber no tamanho do pacote de download fornecido no site oficial.

Uma das principais desvantagens é a “burocracia” necessária para utilizar ou extender os componentes. A sintaxe da ExtJS é mais extensa do que a da Jquery, por exemplo, mas com um pouco de tempo utilizando o framework isso acaba não sendo mais uma barreira. Outra desvantagem é a comunidade. Apesar de ser possível obter respostas rápidas nos fóruns nacionais/internacionais, os experts tendem a parecer um pouco rudes com os novatos, mas com um pouco de insistência eles acabam dando uma boa ajuda na solução de bugs e dúvidas.

Acredito que a utilização da ExtJS depende muito do prazo definido para o projeto e do aprendizado da equipe. No começo o framework tende a ser um pouco complexo, principalmente para quem está acostumado com Jquery ou algum outro framework Javascript fácil de se trabalhar, mas após uma boa vivência com o framework ele torna-se um aliado poderoso para a UI.

Adobe Flex

Adobe Flex, odiado por uns, amado por outros. Para mim é o framework RIA mais robusto e de fácil aprendizagem com que já trabalhei. No início pode parecer um bicho de sete cabeças, mas com pouco tempo de estudo é possível já codificar as UIs e comunicar com a aplicação remota muito facilmente. Uma de suas principais características é a independência do backend, você pode ter PHP e com muita facilidade mudar para outra linguagem como Java ou Rails. Ele possui muitos componentes, todas as necessidades de um sistema RIA podem ser supridas com este framework. Outra vantagem é que por rodar no Flash Player o visual é consistente por todos os browsers, inclusive o IE.

Inicialmente eu não tive uma boa experiência com ele, talvez pela falta de vontade de aprender (sempre odiei Flash), ou pela forma com que estava trabalhando, mas posteriormente vi que ele dava conta do recado e que só precisava ser utilizado da forma correta. Você pode definir uma skin para a sua aplicação, utilizar algum framework como Swiz ou Cairgorn para melhorar a estrutura e facilitar em alguns pontos da UI, além de existir a possibilidade de, além de fazer uma versão para rodar no browser, fazer uma versão com Adobe AIR para rodar no computador, semelhantemente a uma aplicação desktop, como Delphi ou Java com Swing.

É a tecnologia que estou prefirindo para RIA, utilizando PHP como backend. Algumas barreiras sempre aparecem, porém o Live Docs da Adobe quase sempre soluciona os problemas, quando não soluciona, existem diversos grupos de discussão e fóruns.

Conclusão

As alternativas são muitas, além destes citados no artigo, ainda existe o OpenLaszlo, o JavaFX, fora os diversos frameworks Javascript, como o do Yahoo e etc. No meu caso o Adobe Flex supre as necessidades que encontro com relação a UI, além de me dar interoperabilidade, tanto na web como no desktop (com o Adobe AIR), flexibilidade na escolha do backend e uma boa comunidade para ajudar quando surge alguma dificuldade. Como disse no início do artigo, isso pode variar de pessoa para pessoa, cabe a cada um pesquisar e ver o que mais se adequa a sua realidade. E você leitor, tem alguma experiência com frameworks RIA? Deixe no campo de comentários sua opinião, todas opiniões são bem-vindas e pode auxiliar quem está a procura de um bom framework RIA.

Debug de Aplicações PHP com XDebug e Eclipse PDT

No artigo anterior, demonstrei passo a passo como instalar no Ubuntu 9.10 a extensão XDebug, utilizada no debugging e profiling de aplicações PHP. Neste artigo demonstro as configurações necessárias para integrar esta ferramenta com a IDE Eclipse PDT.

Configurando o XDebug

Antes de ir ao Eclipse, é necessário modificar algumas diretrizes de configuração do XDebug, para isto basta abrir o arquivo de configuração do PHP como root:

sudo gedit /etc/php5/apache2/php.ini

E na seção:

[Zend]
zend_extension="/usr/lib/php5/20060613+lfs/xdebug.so"

Adicionar logo abaixo o seguinte conteúdo:

[xdebug]
xdebug.remote_enable=On
xdebug.remote_host="localhost"
xdebug.remote_port=9000

Após fazer isso, basta verificar se o phpinfo() traz o seguinte resultado:

Resultado da função phpinfo()

Com isso o XDebug está devidamente configurado.

Configurando o Eclipse

A primeira coisa a se fazer no Eclipse é adicionar o executável do PHP. No menu Window -> Preferences existe um menu lateral com o título PHP, ao expandí-lo aparecerá a opção PHP Executables, ao clicar nesta opção aparecerá a seguinte janela:

Janela de executáveis do PHP

Basta então clicar no botão Add e colocar um nome qualquer, informar o caminho do executável (por exemplo, /usr/bin/php) e escolher o tipo do debugger, que é XDebug. O próximo passo é configurar as informações do debugger no Eclipse, para isto basta ir em: PHP -> Debug -> Installed Debuggers, lá existirá uma entrada para o XDebug, basta verificar se a porta é a 9000, e caso não seja clicar em Configure e alterá-la. Após isto basta ir em PHP -> Debug e modificar o PHP Debugger para o XDebug.

Após estas configurações o Debugging do Eclipse já deverá estar funcionando. Caso não esteja, é necessário verificar se o servidor padrão está apontando para a URL correta do Web Server, para isto basta ir em Window -> Preferences -> PHP -> PHP Servers e editar as configurações do servidor padrão.

Exemplo de Debugging

Agora a última etapa é fazer um teste para verificar se tudo está funcionando. Para isso basta criar um projeto PHP, e criar um arquivo chamado teste.php. Dentro deste arquivo é acrescentado o seguinte conteúdo:

<?php
$teste = "ola";
$muaha = array();
for ( $i = 0; $i &lt; 3; $i++ ) {
	$muaha[] = $i;
}
array_shift($muaha);
echo "fim";

Ele é bastante simples, vai criar duas variáveis, fazer um laço para preencher o array, tirar o primeiro elemento do array e imprimir o texto fim. Para executar ele, basta clicar na pequena seta logo à direita do botão de Debug, como apresentado na imagem abaixo, e ir em Debug as -> PHP Web Page.

Botão de Debug no Eclipse

Ele então avisará para abrir a perspectiva de Debug, basta confirmar clicando em Yes e a seguinte tela aparecerá:

Perspectiva de Debug

Pode-se notar que existe uma barra logo à esquerda da numeração das linhas, ao clicar nesta barra será adicionado um breakpoint, que é um ponto de parada na execução do script, o que permite verificar a situação do script até este ponto, como as variáveis alocadas, o conteúdo delas etc. A nível de teste, basta colocar 2 breakpoints, um na linha 4 e outro na linha 8. Após isto basta executar o script, clicando no botão com seta verde, localizado na aba Debug, ele é apresentado na imagem abaixo:

Localização do botão para resumir a execução do script

Logo na primeira parada é possível verificar as variáveis, como o array vazio e a string devidamente preenchida, isto é apresentado na imagem abaixo:

Primeira execução do script

Ao clicar novamente no botão para resumir a execução do script, será feito um dos loops do for definido até que a condição especificada ($i < 3) seja cumprida, ou seja, serão necessários 4 cliques no botão para sair do for :P . Neste laço é possível verificar que o array vai sendo preenchido, e após sair do loop e parar na linha 8 o array está com apenas 2 elementos devido à função array_shift. As imagens abaixo representam, respectivamente, o fim do loop e a parada na linha 8.

Fim do loop: Array com 3 elementos

Parada na linha 8: Array com 2 elementos

E por último, é exibida a saída da página na tela, e a aba de variáveis é limpa, assim como apresentado na imagem abaixo:

Fim do Debug

Concluindo

O XDebug é uma ferramenta bastante útil para programadores PHP, com ela é possível debugar cada trecho do código para garantir uma maior consistência a ele e (tentar) eliminar bugs. Além de debug ela também fornece a funcionalidade de profiling, que será abordada em um artigo futuro. Até a próxima.

Trabalho de Conclusão de Curso: Proposta de Arquitetura para Desenvolvimento Web Baseada em PHP utilizando Design Patterns, Um Estudo de Caso

Olá a todos, como vão? Algum tempo parado com o blog, apesar de ter dito que agora eu teria mais tempo para me dedicar a ele, não é o que está acontecendo :D . Bom hoje trago para vocês o meu tema de trabalho de conclusão de curso, com o qual conclui minha graduação no Centro de Ensino Superior de Foz do Iguaçu, me tornando Bacharel em Ciência da Computação. Na segunda-feira dia 7 de Dezembro de 2009, apresentei a banca final, defendendo o tema, explanando toda a parte prática (a parte teórica foi apresentada na banca parcial) e ganhando a aprovação dos avaliadores da banca.

Objetivo Geral

Propor uma arquitetura de desenvolvimento de aplicações em PHP contendo design patterns que forneça uma maior estrutura organizacional, padronização de programação, facilidade de manutenção, menos repetição de código e que evite bad smell (algo errado no código que necessita ser refatorado).

Arquitetura Definida

Diagrama da arquitetura definida

Diagrama da arquitetura definida

O fluxo definido por esta arquitetura segue o padrão definido pelo Zend Framework e, também, possui algumas customizações para a comunicação entre cada camada. A estrutura base do framework é baseada no pattern Model-View-Controller (MVC), o que divide a aplicação em Model, View e Controller. Na arquitetura, conforme apresentado na Figura acima ainda existem as camadas: Facade, Data Mapper e Table Data Gateway.

Todo o fluxo inicia-se por uma requisição feita por um usuário, o framework definirá qual o Controller requerido, este então será responsável por tratar a requisição e, utilizando o pattern Factory Method, o Controller obtém a Facade ligada ao caso de uso a que ele corresponde e então delega para esta camada o processamento da lógica referente a regra de negócio.

A Facade poderá utilizar um Data Mapper para obter dados do banco de dados, ou para fazer operações a registros do banco. O Data Mapper irá utilizar o Table Data Gateway para efetuar as operações SQL, que é a linguagem compreendida pelo banco de dados. Ele também poderá mapear os dados vindos do Table Data Gateway para objetos Model, que representam em forma de objetos as entidades do banco de dados.

Existe ainda a implementação do Observer e Observable, que fazem parte do design pattern Observer. Uma classe Observable possuirá métodos para se conectar a Observers e para notificar cada um deles. A classe Observer irá fazer um log das operações notificadas pela Observable, gravando este log em banco de dados, no formato JSON, para permitir uma consulta posterior.

Após todo o processamento das camadas inferiores ser concluído, o Controller irá continuar o fluxo da aplicação, exibindo a View para o usuário, que pode conter os dados pegos pelo Data Mapper, ou os formulários definidos pelos componentes Zend_Form para obter dados para algum registro, ou mensagens relevantes para informar ao usuário.

O design pattern Singleton é implementado por diversos componentes do Zend Framework, como, por exemplo, o Zend_Auth que é utilizado na autenticação de usuários. Com este pattern é possível manter os objetos durante a aplicação e por apenas um ponto de entrada. Isto garante a consistência deste objeto, sabendo sempre o que esperar dele.

Aplicação de Exemplo

Para fazer o estudo de caso foi necessário a elaboração de uma aplicação, esta sendo um sistema simples de controle de bibliotecas. Como não era necessário especificar um cliente real, foram criadas algumas regras de negócio que o sistema devia atender e então construí todo o sistema utilizando a arquitetura. A observação que deixo para quem for analisar a aplicação é que a regra de negócio é sim extremamente simples, e acredito que se fosse aplicar a aplicação a uma biblioteca real existiria muita coisa a se trabalhar, porém com ela foi possível demonstrar o uso da arquitetura e o resultado foi bem satisfatório. Os casos de uso criados são demonstrados no diagrama de casos de uso apresentado na Figura abaixo:

Diagrama de Casos de Uso

Diagrama de Casos de Uso

Conclusões

A principal conclusão apresentada na minha monografia é com relação a manutenibilidade dos sistemas e ciclo de vida. Com uma arquitetura padronizada e altamente reutilizável graças a um ótimo framework e a utilização de design patterns pode-se aumentar bastante o ciclo de vida, principalmente porque desenvolvedores que forem alterar as aplicações já prontas, deverão apenas se familiarizar com os patterns já especificados e reconhecidos mundialmente, e, também, ler a documentação da arquitetura, para saberem onde exatamente alterar as partes necessárias. Os trabalhos futuros são:

  • Tornar a arquitetura independente de framework;
  • Basear a arquitetura em plugins para facilitar a criação e atualização de funcionalidades de sistemas;
  • Escolher entre os design patterns existentes para adicionar ou remover patterns de acordo com a necessidade das aplicações que forem desenvolvidas.

A Monografia

Código-Fonte

O código-fonte com a arquitetura e a aplicação de exemplo poderão ser baixados no link abaixo. Se você tiver melhorias e dicas por favor envie um comentário que ficarei bem agradecido, principalmente se forem coisas construtivas. Bom, é isso, gostaria só de anunciar as boas novas e, também, divulgar esta arquitetura, que ao meu ver ficou muito boa para se trabalhar, e que já estou utilizando em um sistema real… :)

Código-Fonte da Arquitetura

Instalando XDebug no Ubuntu 9.10

Olá a todos! Hoje demonstrarei os passos necessários para se instalar a ferramenta de debug e profiling para PHP chamada XDebug. Esta ferramenta é relativamente nova para mim, e pode ser uma grande aliada para garantir a performance e qualidade de seu código.

O primeiro passo é instalar os pacotes necessários para poder instalar o XDebug a partir do repositório de extensões PHP:

sudo apt-get install php5-dev php-pear

Com o PECL pode-se instalar novos pacotes no estilo do apt-get, utilizado para instalar pacotes no sistema operacional. Neste repositório é possível instalar o XDebug, para isso basta o seguinte comando:

sudo pecl install xdebug

Após a extensão ser instalada, é necessário verificar o caminho completo onde ela se encontra, para isso basta digitar o seguinte comando:

find / -name 'xdebug.so' 2> /dev/null

No meu caso o caminho retornado foi:

/usr/lib/php5/20060613+lfs/xdebug.so

Agora, a última etapa é configurar o php.ini:

sudo gedit /etc/php5/apache2/php.ini

E adicionar o seguinte conteúdo no fim do arquivo:

[Zend]
zend_extension="/usr/lib/php5/20060613+lfs/xdebug.so"

Onde o caminho utilizado para o atributo zend_extension deve ser o retornado pelo comando de pesquisa. Após isso basta reiniciar o serviço Apache:

sudo service apache2 restart

E então verificar a saída do phpinfo(), que deverá ter um trecho como este:

phpinfo() com dados do XDebug

phpinfo() com dados do XDebug

Bom, com isto a instalação do XDebug foi um sucesso, para quem quer mais informações sobre o XDebug e os repositórios oficiais do PHP:

Como o objetivo deste artigo era só abordar a instalação da extensão acredito que a missão esteja cumprida, em um artigo futuro farei um breve tutorial sobre como debugar os scripts PHP e, também, sobre como funciona a ferramenta de profiling desta extensão.
Para quem acompanhou os artigos sobre a arquitetura de software com CodeIgniter, também falo que em breve colocarei aqui o artigo para desenvolvimento de um sistema visando demonstrar o uso desta arquitetura. Agora o tempo está um pouco menos apertado, poderei me dedicar mais ao blog. Até mais.

LaTeX no Ubuntu 9.10

Olá a todo, como vão? Como estou tendo a necessidade de reinstalar os pacotes e ferramentas do LaTeX para continuar escrevendo minha monografia, resolvi escrever um artigo rápido explicando os pacotes necessários para ter o LaTeX junto com as ferramentas comumente utilizadas em trabalhos de monografia.

A primeira coisa a se fazer é instalar os pacotes do texlive:

sudo apt-get install texlive

Com ele, os principais pacotes utilizados no LaTeX já serão instalados. Após isso, é hora de se focar nos pacotes que fazem a formatação do trabalho seguindo as normas da ABNT. O primeiro pacote é um requisito exigido pelo pacote da ABNT, para instalar este requisito basta digitar o seguinte comando:

sudo apt-get install texlive-math-extra

Caso este pacote não seja instalado aparecerá o seguinte erro ao compilar um trabalho que utiliza o pacote de normas da ABNT:

LaTeX Error: File `stmaryrd.sty' not found.

Agora, basta instalar o pacote abntex, que é o responsável pela formatação do trabalho nas normas da ABNT:

sudo apt-get install abntex

Os principais pacotes estão instalados, então basta instalar a IDE utilizada na criação dos documentos TEX:

sudo apt-get install texmaker

Existem outras IDEs como, Kyle, porém eu me adaptei bem ao texmaker e ela é minha IDE padrão.

Agora, outra coisa utilizada na monografia é a lista de siglas/símbolos. Para fazer esta lista é utilizado o pacote glossaries. Para instalar o pacote glossaries existem alguns pré-requisitos que devem ser supridos, estes sendo os seguintes pacotes:

  • ifthen;
  • xkeyval;
  • xfor;
  • amsgen.

No meu caso foi necessário apenas o xfor, e o pacote do glossaries em si, baixei eles no seguinte link: http://www.ctan.org/pub/tex-archive/install/macros/latex/contrib/. Os pacotes “tds” são mais fáceis de se instalar, pois já estão configurados, basta jogar no banco de dados do LaTeX e atualizá-lo. Então, após baixar os pacotes: xfor.tds.zip e glossaries.tds.zip, em um terminal basta criar uma pasta para armazenar os pacotes:

mkdir ~/texmf

Extrair os pacotes no diretório:

unzip xfor.tds.zip  -d ~/texmf/
unzip glossaries.tds.zip -d ~/texmf/

E, finalmente atualizar o banco de dados do LaTeX:

texhash ~/texmf/

No meu caso, seguindo todos estes procedimentos, tudo deve estar funcionando. Se alguém encontrar erros por favor postem nos comentários que tentarei ajudar. Como este tutorial visava apenas apresentar os procedimentos para instalação, não incluirei exemplos para fazer os testes de cada um destes pacotes. Se alguém tiver curiosidade e quiser testar se tudo está funcionando, ver como criar as siglas e etc, recomendo o seguinte tutorial: Glossaries, Nomenclature, Lists of Symbols and Acronyms.

Por hoje é só, recomendo o LaTeX a todos que forem fazer a monografia ou demais trabalhos escritos, principalmente devido a falta de preocupação em ficar ajustando a formatação, já que ele faz isso automaticamente, além de diversas outras coisas que ele automatiza. Até a próxima!

Reapresentação da palestra Webservices REST com Zend Framework

Ontem eu e o Jurmir apresentamos na Semana Acadêmica Integrada 2009 do CESUFOZ a palestra Webservices REST com Zend Framework. Quem ainda não viu os slides, confira-os no post original, escrito após a apresentação na Latinoware. Agradeço a todos que nos prestigiaram e espero que tenham gostado da palestra. Esta foi uma reapresentação da palestra da Latinoware, o bom desta palestra é que tínhamos internet, então foi possível demonstrar o cliente Twitter, apesar de não ter sido possível inserir novos status, mas tudo bem, já foi muito mais completa do que a da Latinoware.

Estou em processo de término da monografia, além de estar atuando em alguns projetos, em breve espero colocar mais artigos aqui no blog. Até mais.

Palestra – PHP, Mercado e Certificações

Apresentei ontem na Semana Acadêmica Integrada 2009 do Centro de Ensino Superior de Foz do Iguaçu a palestra entitulada PHP, Mercado e Certificações. Nela, procurei abordar um pouco da evolução da linguagem, mostrar que seu futuro é promissor, empresas que a utilizam (grandes companhias e empresas da cidade), perfis de profissionais, dicas para se tornar um profissional melhor e uma abordagem geral sobre as certificações da Zend, me focando mais na de PHP5 que eu já possuo alguma experiência. Espero que todos tenham gostado da palestra, segue os slides:

Cliente Twitter com Zend Framework

Bom, como disse no outro post fiz um cliente com o Zend Framework para consumir o serviço REST disponibilizado pelo Twitter. Este cliente era para ser apresentado na palestra da Latinoware, infelizmente não foi possível o acesso à internet, o que faria com que o cliente não funcionasse, então acabei nem mostrando ele. Disponibilizo aqui então este cliente, para utilizá-lo é necessário ativar o mod_rewrite no Apache e, provavelmente, ativar a extensão curl do PHP. Tendo estes requisitos, descompacte o zip na pasta acessível pelo Apache, altere o arquivo application/configs/application.ini para que ele contenha o usuário e senha utilizados no seu banco de dados MySQL, como no exemplo abaixo:
resources.db.params.username = "root"
resources.db.params.password = ""

Então, crie o banco de dados utilizando o arquivo encontrado em db/banco.sql. Após certificar-se de tudo estar pronto basta ir no browser e acessar o cliente na sua URL local, para quem não conhece o Zend Framework é necessário acessar a pasta public para que ele funcione… por exemplo: http://localhost/zf_twitter/public. Então é só cadastrar seu usuário e senha do twitter, logar-se e postar seus twitts, visualizar os últimos twitts de seus amigos, seu perfil e fazer buscas por twitts. Espero que gostem e lembro que é um aplicativo simples, mas quem estiver afim pode extendê-lo sem nenhum problema.

Para baixar o cliente, clique aqui

Até o próximo post.

Palestra Webservices REST com Zend Framework

Ontem foi um dia bem diferente para mim, apresentei na Latinoware uma palestra sobre Webservices REST com Zend Framework, junto com meu amigo Jurmir. Fiquei bem nervoso, mas depois que comecei a falar consegui me acalmar e apresentar tranquilamente. Agradeço a todos que estiveram lá e espero que tenham gostado da palestra. Infelizmente graças a ótima rede wireless disponibilizada lá, não pude mostrar o aplicativo que fiz para consumir o webservice do Twitter, mas daqui a pouco disponibilizarei ele aqui no site. Bom, segue abaixo os slides da palestra (via slideshare).

Novidades do PHP 5.3

Olá a todos, como vão? Eu sei que este assunto já está bem “manjado”, mas a nova versão do PHP trouxe diversas novidades para a linguagem, e como ainda não havia estudado-as, resolvi ler mais sobre elas e expor as que mais achei interessante neste post.

A idéia do PHP 5.3 era trazer novas funcionalidades e também corrigir diversos bugs, além, também de preparar o terreno para a versão 6 da linguagem. Uma lista abrangendo TODAS estas funcionalidades é encontrada abaixo:

  • Suporte a namespaces;
  • Late static binding;
  • Funções Lambda e closures;
  • Adições de sintaxe: NOWDOC, função goto para “pular” entre trechos de código baseando-se em um label de identificação em cada trecho, __callStatic();
  • Melhorias de performance;
  • Garbage Collection opcional para referências cíclicas;
  • Opcional substituição da biblioteca libmysql para a mysqlnd;
  • Melhoria ao suporte ao SO Windows, incluindo binários VC9 e X64, assim como na portabilidade com outras plataformas;
  • Arredondamento de floats de uma forma mais consistente;
  • Erros de notice que informavam sobre Deprecateds agora possuem uma própria diretiva de erros que é E_DEPRECATED, ao invés de utilizar a E_STRICT;
  • Diversas melhorias para dar mais flexibilidade ao php.ini;
  • Extensões nativas: PHAR, intl (Internacionalização), Fileinfo, sqlite3 e Enchant;
  • Mais de 140 correções de bugs e melhorias ao PHP, em particular às extensões: openssl, spl e  date.

Agora vou abordar as novidades dessa lista que mais me chamaram a atenção, lembrando que isso vai de cada desenvolvedor, provavelmente as que explico aqui podem não ser tão interessantes para o seu dia-a-dia.

Namespaces

Falando de modo geral, uma namespace nada mais é do que uma forma de encapsular itens. Tendo como exemplo uma estrutura de diretórios de um determinado sistema operacional, um arquivo chamado “arquivo.txt” pode estar na pasta /home/teste como também na pasta /home/pessoal, mas não poderá existir dois arquivos de nome igual em uma mesma pasta. Este mesmo princípio está presente no mundo da programação.

No PHP, as namespaces foram criadas para resolver problemas que autores de bibliotecas e aplicações encontram quando estão criando elementos de código reutilizáveis como classes ou funções, estes problemas são:

  • Conflitos de nomes entre os códigos criados e classes/bibliotecas/funções ou constantes internas do PHP, ou de bibliotecas de terceiros;
  • Habilidade de apelidar (ou encurtar) nomes longos (por exemplo, Extra_Long_Name) destinados a solucionar o primeiro problema, aumentando a legibilidade do código-fonte.

Como um simples exemplo de namespace, considere a seguinte classe, salva em um arquivo chamado “namespaces.php”:

<?php
//define uma Namespace
namespace my\name
class MinhaClasse {}

Ele apenas define uma namespace denominada “my\name”, com uma classe dentro. Agora, para acessar esta classe utilizando a namespace, pode-se utilizar o seguinte código, localizado em um arquivo “namespaces_uso.php”:

<?php
require_once 'namespaces.php';
//instancia uma classe de uma determinada namespace
$classe = new my\name\MinhaClasse;

Simples assim. Existem outros meios de se utilizar as namespaces, recomendo a leitura dos seguintes links:

http://br.php.net/manual/en/language.namespaces.rationale.php

http://br.php.net/manual/en/language.namespaces.importing.php

Funções Lambda e Closures

Funções anônimas, também conhecidas como closures, permitem a criação de funções que não possuem nomes específicos. Estas funções ficaram muito conhecidas pelos desenvolvedores web graças ao javascript, que as utiliza amplamente.

Uma implementação simples deste tipo de função é a seguinte:

<?php
$olaMundo = function($nome)
{
echo "Ola Mundo: {$nome}";
};

Neste código é atribuída uma função à variável “$olaMundo”, bastando o seguinte código para utilizá-la:

$olaMundo('fernando');

Para maiores informações sobre funções lambda e closures, acesse:

http://br.php.net/manual/en/functions.anonymous.php

NOWDOC

O NOWDOC é para o HEREDOC o que as aspas simples (‘) são para as aspas duplas (“): no NOWDOC todo o texto é imprimido do jeito que ele foi digitado e no HEREDOC trechos do texto contendo “$” ou outros símbolos que podem ser parseados, serão interpretados. De forma mais resumida: no NOWDOC não existe parsing e no HEREDOC existe parsing. Ele é definido da mesma forma que o HEREDOC, diferenciando no fato de que o identificador deve conter aspas simples.

Outra diferença entre o NOWDOC e o HEREDOC é que o NOWDOC pode ser definido em qualquer contexto de dado estático, até para inicializar atributos de classes ou constantes.

Um exemplo de NOWDOC:

<?php
//atribui um longo texto à string
$string = <<<'TEXT'
  Este é um texto em NOWDOC, onde um
  "$" é um "$" E {$} não é parseado.
TEXT;
echo $string;

O resultado deste script demonstra que não ocorre nenhum parsing da string, imprimindo exatamente o que foi digitado.

Para quem ainda não sabe, HEREDOCs e NOWDOCs podem ser utilizados para definir longos textos dentro de uma variável PHP, melhorando a legibilidade do código. Ele é semelhante aos campos <![CDATA[ ]]> do SGML, pois ele declara um bloco de texto que não é parseado.

Mais informações sobre NOWDOC:

http://br.php.net/manual/en/language.types.string.php#language.types.string.syntax.nowdoc

__callStatic

__callStatic é um método mágico interessante adicionado nesta versão do PHP. O método __call é invocado quando um método de uma determinada classe está inacessível, no contexto de objeto. O problema é que não havia uma maneira de tratar estes métodos em um contexto estático. Aí que entra o __callStatic. Para entender melhor o conceito, o seguinte código pode ser tomado como exemplo:

<?php
class MinhaClasse
{
	public function __call($metodo, $parametros)
	{
		echo "O metodo '$metodo' foi chamado<br />";
	}
	public static function __callStatic($metodo, $parametros)
	{
		echo "O metodo '$metodo' foi chamado estaticamente";
	}
}

Este exemplo apenas define uma classe com os métodos mágicos explanados acima. Agora, considerando o exemplo abaixo, a primeira chamada de método executa o método __call e a segunda chamada irá executar __callStatic, pois está chamando o método de forma estática.

$obj = new MinhaClasse();
$obj->metodo();
MinhaClasse::metodo();

Bom, esta foi uma explanação das novidades do PHP 5.3 que mais me chamaram a atenção. Lembro a todos que todas as informações explanadas aqui foram retiradas do site oficial do php. Até o próximo post.