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.

Agora ZCE PHP 5 e novo site!

Olá galera, como estão? Estive estudando arduamente para a certificação, e ontem (21 de agosto), às 9 horas da manhã, fiz a minha prova, e agora sou o mais novo Zend PHP5 Certified Engineer!

Foi uma semana difícil, onde durmi no máximo 5 horas durante as noites, estava estudando muito, queria mesmo tirar a certificação. Na quinta-feira, fiz uns 3 ou 4 simulados, e consegui notas bacanas, mas mesmo assim não estava muito confiante. Finalmente, ontem depois de uns 30 minutos de prova, cliquei em “End Exam” e veio a boa notícia: PASSEI!!!

Só posso agradecer aos meus amigos, clientes e familiares por compreenderem os motivos de minhas ausências, e por me apoiarem, e, também, devo agradecer a Deus por estar sempre olhando por mim e por me dar força nas horas mais difíceis de minha vida. Eu dedico esta certificação a todos vocês, em especial a minha mãe, que sempre me apóia mesmo quando tenho as decisões mais malucas possíveis!

Aproveitando esta grande motivação/satisfação que a certificação me deu, resolvi migrar meu antigo site (Drupal) pra WordPress, principalmente por eu gostar muito deste CMS. Peguei este tema, que está com seus devidos créditos no rodapé, traduzi para português e resolvi utilizá-lo, espero que gostem!

Com a certificação eu acredito que várias portas se abrirão para mim, e eu ainda não parei, quero tirar certificações Java, LPI e do Zend Framework; mas elas podem esperar um pouco, porque agora devo me dedicar ao meu site, trabalho e à faculdade.