Aprofunde se no php 5.3
-
Upload
marcus-vinicius -
Category
Documents
-
view
2.096 -
download
1
description
Transcript of Aprofunde se no php 5.3
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 System\Control;
class UserController {}
$uc = new \System\Control\UserController();
$uc2 = new UserController(); //mesma classe da declaração anterior
Definição de funções
<?php
namespace System\Control;
function hello(){
return “Hello”;
}
echo \System\Control\hello(); //Hello
echo hello(); //Hello
Usando Classes de outro Namespace
<?php
namespace Zend\SignalSlot {
class Signals{}
}
namespace{ //global
use Zend\SignalSlot\Signals;
$signals = new Signals();
}
Alterando o nome
<?php
namespace Squirrel\Core{
class Site{}
}
namespace{
use \Squirrel\Core\Site as SquirrelSite;
$squirrelSite = new SquirrelSite();
}
Chamada Global
<?php
namespace Doctrine{
class Manager{public static function load() { }
}
}
namespace{
\Doctrine\Manager::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: @mvleandroE-mail: [email protected]: [email protected]: (21)-8211-9096