APROFUNDE-SE NO PHP 5.3
Marcus Vinicius Bastos Leandro
http://www.phpnaveia.com.br
Você já está usando o PHP 5.3?
Um breve histórico

PHP 5.0 implementou um novo modelo de
objetos

PHP 5.3 nos presenteou com: namespaces,
clousures, late static binding, etc...

PHP 6 ?...
Por que migrar para o PHP 5.3?

Mais rápido

Melhor gerenciamento de memória

Bug fixes

Zend Framework 2.0, Symfony 2.0, Doctrine
2.0 vão requerer o PHP 5.3
Definição de Classes
<?php
namespace SystemControl;
class UserController {}
$uc = new SystemControlUserController();
$uc2 = new UserController(); //mesma classe da
declaração anterior
Definição de funções
<?php
namespace SystemControl;
function hello(){
return “Hello”;
}
echo SystemControlhello(); //Hello
echo hello(); //Hello
Usando Classes de outro
Namespace
<?php
namespace ZendSignalSlot {
class Signals{}
}
namespace{ //global
use ZendSignalSlotSignals;
$signals = new Signals();
}
Alterando o nome
<?php
namespace SquirrelCore{
class Site{}
}
namespace{
use SquirrelCoreSite as SquirrelSite;
$squirrelSite = new SquirrelSite();
}
Chamada Global
<?php
namespace Doctrine{
class Manager{
public static function load() { }
}
}
namespace{
DoctrineManager::load();
}
Late Static Binding
O problema
Classe Mãe
<?php
class Foo{
protected static function speak(){
return “Hi”;
}
public static function sayHi(){
return self::speak();
}
}
Classe Filha
<?php
class Bar extends Foo{
protected static function speak(){
return “Hello”;
}
}
“Hi” ou “Hello” ?
<?php
echo Bar::sayHi();
“Hi” ou “Hello” ?
<?php
echo Bar::sayHi(); //Hi
A solução
Classe Mãe
<?php
class Foo{
protected static function speak(){
return “Hi”;
}
public static function sayHi(){
return static::speak();
}
}
Classe Filha
<?php
class Bar extends Foo{
protected static function speak(){
return “Hello”;
}
}
“Hi” ou “Hello”
<?php
echo Bar::sayHi(); //Hello
Clousures / Lambdas
Atribuindo a variáveis
<?php
$sayHi = function(){
return “Hi”;
}
echo $sayHi();
Escopo
<?php
$saudacao = 'Olá';
$falar = function ( $nome ) use ($saudacao){
return $saudacao . ' ' . $nome;
}
echo $falar('Marcus'); //Olá Marcus
Funções anônimas
<?php
function processaAlgo( $valor, $callback ){
…
$callback();
}
processaAlgo( 10, function(){
echo “Processado ...”;
} );
Phar ( PHP Archive )

Distribuindo aplicações em um único arquivo
Criando arquivos Phar
<?php
$phar = new Phar(
'/projeto/app.phar', //caminho para o arquivo
0, //parâmetros
'app.phar' //Alias para referências
);
$phar->startBuffering();
Adicionando arquivos
<?php
$phar->addFile( “/projeto/header.php” );
$phar->addFile( “/projeto/funcoes.php”,
“/lib/global.php” );
Adicionando arquivos – outra forma
<?php
$phar['index.php'] =
file_get_contents( '/projeto/index.php' );
$phar['header.php'] = '<h1>Header</h1>';
Adicionando arquivos de um
diretório
<?php
$phar->buildFromDirectory( '/projeto', '/.php/' );
Stub

O arquivo Stub é um pedaço de código que
será executado quando o arquivo Phar for
carregado. Para definir o pedaço de código que
será executado ao carregar o arquivo Phar
pode-se usar o método setStub que aceita o
código em forma de string.
Stub
<?php
$phar->setStub('<?php Phar::mapPhar();
include "phar://app.phar/index.php";
__HALT_COMPILER(); ?>');
Stub

O código deve terminar com a função
__HALT_COMPILER().

O método statico Phar::mapPhar() lê e inicializa
o arquivo Phar a ser executado.

O streammer phar:// é usado para referenciar
os arquivos que estão dento do pacote Phar.
No exemplo anterior ao carregar o arquivo
app.phar será executado o arquivo index.php.
Stub

Caso não exista nenhum procedimento
especial ao carregar o arquivo Phar, e você
deseja simplesmente executar um arquivo php
diretamente, use o método createDefaultStub.
É só passá-lo como parâmetro para o método
setStub.
Stub
<?php
$phar->setStub($p-
>createDefaultStub( 'index.php' ) );
Exemplo completo

index.php
<?php
echo “Olá mundo”;
?>
Script para criar o Phar

criaPhar.php
<?php
$p = new Phar('teste.phar', 0, 'teste.phar');
$p->startBuffering();
$p['index.php'] = file_get_contents("index.php");
// $p->addFile('index.php'); - segunda opção para
incluir arquivos.
$p->setStub($p->createDefaultStub('index.php'));
$p->stopBuffering();
Criando o phar
# php criaPhar.php

Após a execução do script acima será criado o
arquivo teste.phar
Executando o Phar
# php teste.phar

A saída da execução será:
Olá Mundo
E tem mais...

Funções de internacionalização

SQLite versão 3

FileInfo: mime-type, encoding -
http://www.php.net/manual/en/ref.fileinfo.php
DateTime Object

Adicionar o subtrair datas

Calcular a diferença entre duas datas

Definir/recuperar unix timestamp

http://www.brandonsavage.net/cool-datetime-
functions-in-php-5-3/
Novas estruturas SPL
SPL Stack

Push e Pop

Last in, First Out (LIFO)

Usa menos memória do que arrays para
grandes pilhas ( mais que 5.000 elementos )
SPLQueue

Enqueue & Dequeue

First in, First Out (FIFO)

Mais rápida e usa menos memória que arrays
SPLHeap

Insert & Remove

Reordena elementos baseado em
comparações

Mais rápido e usa menos memória que arrays
Veja mais em
http://matthewturland.com/2010/05/20/new-spl-
features-in-php-5-3/
GOTO

Essa parte pula
Nova sintaxe
__invoke()
<?php
class Foo{
public function __invoke($x){
return $x + $x;
}
}
$foo = new Foo();
echo $foo(2); //4
__callStatic()
<?php
class Foo{
public static function __callStatic( $name, $args ){
return $name . ' foi chamada estaticamente';
}
}
echo Foo::bar(); //bar foi chamada
//estaticamente
__DIR__
<?php
echo dirname(__FILE__);
echo __DIR__;
Novo ternário
<?php
$user->setApelido('mvleandro');
$apelido = $user->getApelido()?:'Não informado';
echo $apelido; //mvleandro
Referência

PHP Manual – http://php.net/

Bradley Holt – http://bradley-holt.com/

PHP Brasil - http://phpbrasil.com/
Perguntas?
Obrigado
Marcus Vinicius Bastos Leandro
http://www.phpnaveia.com.br
Twitter: @mvleandro
E-mail: mvleandro@gmail.com
MSN: marcus_leandro@hotmail.com
Cel: (21)-8211-9096

Aprofunde se no php 5.3