Novidades do PHP 5.4 – conheça as mudanças

PHP

Novidades do PHP 5.4 – conheça as mudanças

Atenção! Essa postagem foi escrita há mais de 2 anos. Na informática tudo evolui muito rápido e algumas informações podem estar desatualizadas. Embora o conteúdo possa continuar relevante, lembre-se de levar em conta a data de publicação enquanto estiver lendo. Caso tenha sugestões para atualizá-la, não deixe de comentar!

Como você deve saber, o PHP 5.4 está às portas e ele é praticamente o PHP 6. Dia 11 de dezembro foi lançado o RC1 do PHP 5.4 e fui dar uma conferida no que há de novo. Lhe digo: é surpreendente!

Se quiser dar uma olhada na lista completa de novas features, dê uma olhada na news.

Caso ainda não saiba do que se trata o PHP 6 e qual a diferença para o PHP 5.4, dê uma olhada nesse artigo que escrevi há alguns dias: Tornando-se compatível com o PHP 6.

Agora apresento-lhes as características que, na minha opinião, são as mais bacanas dessa nova versão!

Servidor HTTP incorporado

Assim como em outras linguagens, o PHP agora também possuirá um servidor HTTP embutido. A maneira mais simples de colocá-lo para funcionar é a seguinte:

php -S localhost:8080

Isso fará com que o servidor rode na máquina local, escutando na porta 8080. Isso é muito importante para quem quer testar rapidamente um arquivo ou um sistema sem ter que configurar toda a estrutura de um servidor. Eu também uso isso (por enquanto, no Python) para compartilhar arquivos pela rede! :)

Sintaxe de array encurtada

Pra mim, uma das alterações mais importantes de todas! Agora não é mais necessário utilizar a função array() para criar vetores.

$frutas = ['Banana', 'Abacaxi', 'Laranja']
$dados = ['nome' => 'Rafael', 'profissao' => 'Professor']

Acesso de propriedades e métodos na instanciação da classe

É possível utilizar fluent interfaces, como no Java:

$meuCarro = (new Carro)->setVelocidade(100)->setCor('azul');

Typehint callable

Esse typehint permite que você passe como um parâmetro uma função, uma função anônima (closure) ou uma array composta por um nome de classe (ou objeto) e um nome de método.

function funcao(callable $func_param) {
  $func_param();
}

// No caso o $func_param() seria a mesma coisa que
// (new Carro)->ligar();
funcao([new Carro(), 'ligar']);

Suporte a valores numéricos binários

Iniciando seus números com 0b é possível definir números binários diretamente no PHP.

$binario = 0b001110;

Suporte à sintaxe Class::{expr}()

Isso fazia MUITA falta! Agora o PHP está mais flexível na hora de invocar métodos. Todas as linhas a seguir são válidas:

$metodo = 'nome_de_metodo';

$teste = new Teste();
$teste->nome_de_metodo();
$teste->$metodo();
$teste->{'nome_de_metodo'}();

Teste::nome_de_metodo();
Teste::$metodo();
Teste::{'nome_de_metodo'}();

Suporte a Traits

As traits são também conhecidas como heranças horizontais.

O PHP não suporta herança múltipla, e por esse motivo, às vezes ficamos limitados em algumas decisões de projeto (design). O maior problema neste ponto é que toda herença até agora (PHP 5.3.x) é vertical, ou seja, se eu precisar de um nível de abstração diferente no meio do processo, ou precisarei adicionar a nova abstração e reescrever tudo abaixo dela, ou ainda, terei que duplicar o código pois não conseguirei satisfazer a herença.

É nesse ponto que os Traits aparecem. Diferentemente da herença (vertical), os Traits possibilitam-nos criar heranças horizontais.

Esse trecho de texto foi retirado do blog do Hélio Costa. Lá você pode saber mais sobre as Traits. Pode também olhar no manual do PHP (em inglês).

class Base {
  public function digaOla() {
    echo 'Olá ';
  }
}

trait DigaMundo {
  public function digaOla() {
    parent::digaOla();
    echo 'mundo!';
  }
}

class MeuOlaMundo extends Base {
  use DigaMundo;
}

$o = new MeuOlaMundo();
$o->digaOla(); // Olá mundo!

 

Suporte a dereferenciamento de arrays

É possível acessar diretamente uma array do retorno de uma função.

 

function frutas() {
return array('a' => 'amora', 'b' => 'banana', 'c' => 'caqui');
}
echo frutas()['c']; // caqui

Desempenho do silenciador (@) melhorado

Nunca recomendei o uso disso mas, de qualquer, melhoraram o desempenho deste operador, que em muitas aplicações é altamente utilizado.

$arquivo = @file_get_contents('/etc/passwd');

Progresso do Upload

De acordo com um dos desenvolvedores do PHP, teremos um medidor de progresso de upload embutido no PHP 5.4 (na versão 5.3 era um patch).

Agora é possível definir uma variável de sessão que é atualizada com o progresso de determinado upload (aleluia). Segue um exemplo:

<form action="upload.php" method="POST" enctype="multipart/form-data">
  
  
  
  

Confesso que espero por isso há tempos!

E outras coisinhas mais…

Existem algumas outras alterações que não são tão impactantes, mas que talvez você goste de saber:

  • Agora existe a possibilidade de desabilitar o processamento de dados do POST a fim de economizar memória e ciclos de CPU. Caso utilize isso, os dados originais ainda (raw data) ainda podem ser lidos pelo stream php://input;
  • Criaram uma interface chamada JsonSerializable, para que o objeto possa ser aceito em um json_encode() (embora o json_decode() não consiga recriar o objeto);

O que NÃO estará no PHP 5.4

Nem todas as features que foram sugeridas acabaram entrando no core do PHP 5.4.

  • Typehint Scalar para parâmetros nos métodos
  • Suporte Unicode/UTF-8 na linguagem para operações de strings :(
  • Tipos primitivos (integer, string, boolean, etc…) como palavras reservadas (foi removido por questão de retrocompatibilidade)
  • Suporte a foreach com list()

Conclusões

Espero que tenha servido para desmistificar as mudanças que vêm aí nas versões 5.4 e 6.0! :)

E você? O que mais gostou no PHP 5.4? Alguma coisa que não falei aqui? Algo que eu falei pouco? Comenta aí e deixa a tua opinião!

Um abraço a todos e fiquem com Deus!
Rafael Jaques

Fontes consultas: