php 5.3 - what's new?

65
PHP 5.3 what’s new? Felipe Ribeiro [email protected] http://feliperibeiro.com @felipernb Saturday, October 31, 2009

Post on 19-Oct-2014

7.181 views

Category:

Technology


1 download

DESCRIPTION

Apresentação feita por mim no 3º Encontro PHP-PB em João Pessoa no dia 31/10/2009

TRANSCRIPT

Page 1: PHP 5.3 - What's new?

PHP 5.3what’s new?

Felipe [email protected]://feliperibeiro.com@felipernb

Saturday, October 31, 2009

Page 2: PHP 5.3 - What's new?

Senta, que lá vem história...

Saturday, October 31, 2009

Page 3: PHP 5.3 - What's new?

1993

Saturday, October 31, 2009

Page 4: PHP 5.3 - What's new?

1993

<HTML> <HEAD> <TITLE>My Personal Home Page</TITLE> </HEAD> <BODY> This is my cool page<P> And look at my counter<P> <IMG SRC="/cgi-bin/counter.pl"> </BODY></HTML>

Saturday, October 31, 2009

Page 5: PHP 5.3 - What's new?

PHP/FI<!--getenv HTTP_USER_AGENT--><!--ifsubstr $exec_result Mozilla-->Hey, you are using Netscape!<p><!--endif-->

<!--sql database select * from table where user='$username'-->

<!--ifless $numentries 1-->Sorry, that record does not exist<p><!--endif exit-->

Welcome <!--$user-->!<p>You have <!--$index:0--> credits left in your account.<p>

<!--include /text/footer.html-->

Saturday, October 31, 2009

Page 6: PHP 5.3 - What's new?

PHP/FI• PHP/FI = Personal Home Page/Forms Interpreter

• Um conjunto de bibliotecas C/Perl e uma linguagem de template que interagia com elas

• GPL

• Estimava-se que estava presente em 1% dos domínios existentes em 1997

Saturday, October 31, 2009

Page 7: PHP 5.3 - What's new?

PHP 3<? $name = "bob"; $db = "db"; $result = msql($db,"select * from table where firstname='$name'"); $num = msql_numrows($result); echo "$num records found!<p>"; $i=0; while($i<$num); echo msql_result($result,$i,"fullname"); echo "<br>"; echo msql_result($result,$i,"address"); echo "<br>"; $i++; endwhile;?>

Saturday, October 31, 2009

Page 8: PHP 5.3 - What's new?

PHP 3• PHP = PHP Hypertext Preprocessor

• Rasmus Lerdorf, Andi Gutmans e Zeev Suraski

• Extensível, suporte a vários SGBDs, servidores Web e protocolos.

• Sintaxe mais poderosa

• Estima-se que estava presente em 10% dos domínios em 1998

Saturday, October 31, 2009

Page 9: PHP 5.3 - What's new?

PHP 4• Core completamente reescrito por Andi Gutmans

e Zeev Suraski (Zend Engine) visando:

• Melhor performance

• Melhor modularização

• Suporte a sessões, “superglobais” $_GET, $_POST, $_SESSION e etc...

• Estima-se que em 2004 estava presente em mais de 20% dos domínios existentes

Saturday, October 31, 2009

Page 10: PHP 5.3 - What's new?

PHP 5<?phpclass SimpleClass { private $attribute; public function foo($bar) { echo $this->attribute * $bar; }}

class ExtendedClass extends SimpleClass { public function foo($bar) { try { do_something(); } catch(FooBarException $e) { die($e->getMessage()); } parent::foo($bar); }}

$o = new ExtendedClass;$o->foo();?>

Saturday, October 31, 2009

Page 11: PHP 5.3 - What's new?

PHP 5• Zend Engine II com novo modelo de objetos

• Interfaces• Exceções• Níveis de visibilidade (public, private, protected)

• SPL

• Tratamento de XML

• 5.1 - Melhorias de performance

• 5.2 - Extensão “filter” habilitada por padrão

Saturday, October 31, 2009

Page 12: PHP 5.3 - What's new?

E agora?

Saturday, October 31, 2009

Page 13: PHP 5.3 - What's new?

E agora?

PHP 5.3

Saturday, October 31, 2009

Page 14: PHP 5.3 - What's new?

Namespaces

Closures

Late static binding

PHAR

goto :-(

Garbage collectorSaturday, October 31, 2009

Page 15: PHP 5.3 - What's new?

Lambdas e Closures

Saturday, October 31, 2009

Page 16: PHP 5.3 - What's new?

Lambdas e Closures

<?php$greet = function($name){    printf("Hello %s\r\n", $name);};

$greet('World'); //Hello World$greet('PHP'); //Hello PHP?>

Saturday, October 31, 2009

Page 17: PHP 5.3 - What's new?

$comparador = function($x,$y) { if($x->idade == $y->idade) return 0; return($x->idade < $y->idade) ? -1 : 1;};usort($array, $comparador);/*Array( [0] => stdClass Object ( [nome] => b [idade] => 14 ) [1] => stdClass Object ( [nome] => a [idade] => 22 ))*/

Lambdas e Closures

Saturday, October 31, 2009

Page 18: PHP 5.3 - What's new?

function getSomador($x) {     return function ($y) use ($x) {         return $x + $y;     }; } $somador = getSomador(10);

echo $somador(5); //15echo $somador(32); //42

Lambdas e Closures

Saturday, October 31, 2009

Page 19: PHP 5.3 - What's new?

• Permitem a criação de funções mais flexíveis

• Closure é uma lambda que tem variáveis obtidas do escopo em que foi declarada.

• Não é novidade do PHP.• Ruby, Python, Javascript, entre outras

linguagens, já têm esse recurso.

• http://php.net/closures

Lambdas e Closures

Saturday, October 31, 2009

Page 20: PHP 5.3 - What's new?

Namespaces

Saturday, October 31, 2009

Page 21: PHP 5.3 - What's new?

NamespacesComo declarar?

<?php

namespace Yahoo\News; class Dir {     ... }

?>

Saturday, October 31, 2009

Page 22: PHP 5.3 - What's new?

NamespacesComo usar?

<?php// usando diretamente $foo = new Yahoo\News\Dir();

// importando o namespace use Yahoo\News; $foo = new News\Dir();

// renomeando a classeuse Yahoo\News\Dir as YND; $foo = new YND(); ?>

Saturday, October 31, 2009

Page 23: PHP 5.3 - What's new?

Namespaces<?php// FooBar.phpnamespace Foo\Bar;

class Baz { function __construct() { echo get_called_class(); }}?>

Saturday, October 31, 2009

Page 24: PHP 5.3 - What's new?

Namespaces<?phprequire './FooBar.php';

use Foo\Bar as FB;

$a = new FB\Baz(); // Foo\Bar\Baz

?>

Saturday, October 31, 2009

Page 25: PHP 5.3 - What's new?

Namespaces• O (polêmico) separador \ (backslash)

• A primeira escolha foi o ::, mas geraria confusão com o atual uso para chamadas estáticas...

• A escolha:• Critérios

• type-ability• typo-vulnerability• parse-ability• IDE compatibility• number of chars

Saturday, October 31, 2009

Page 26: PHP 5.3 - What's new?

Namespaces

http://php.net/namespacesSaturday, October 31, 2009

Page 27: PHP 5.3 - What's new?

Late static binding

Saturday, October 31, 2009

Page 28: PHP 5.3 - What's new?

Late static binding<?phpabstract class ActiveRecord { public function save() { $sql = "INSERT INTO ". self::TABLE. "..."; } ...}

class Post extends ActiveRecord { const TABLE = 'posts'; ...}

$p = new Post();...$p->save();

Saturday, October 31, 2009

Page 29: PHP 5.3 - What's new?

Late static binding<?phpabstract class ActiveRecord { public function save() { $sql = "INSERT INTO ". self::TABLE. "..."; } ...}

class Post extends ActiveRecord { const TABLE = 'posts'; ...}

$p = new Post();...$p->save(); NÃO FUNCIONA!

Saturday, October 31, 2009

Page 30: PHP 5.3 - What's new?

Late static binding<?phpabstract class ActiveRecord { public function save() { $sql = "INSERT INTO ". static::TABLE. "..."; } ...}

class Post extends ActiveRecord { const TABLE = 'posts'; ...}

$p = new Post();...$p->save(); // FUNCIONA

Saturday, October 31, 2009

Page 31: PHP 5.3 - What's new?

Late static binding<?phpclass A { public static function who() { echo __CLASS__; } public static function test() { self::who(); // PHP < 5.3 - Output: A static::who(); // LSB - Output: The class that extends and is called }}

class B extends A { public static function who() { echo __CLASS__; }}B::test(); // AB

?>

Saturday, October 31, 2009

Page 32: PHP 5.3 - What's new?

Late static binding

• Late Static Binding permite referenciar a classe chamada, no contexto de herança estática.

• http://php.net/lsb

Saturday, October 31, 2009

Page 33: PHP 5.3 - What's new?

Garbage Collector

Saturday, October 31, 2009

Page 34: PHP 5.3 - What's new?

Garbage Collector

• O garbage collector do PHP funciona por contagem de referências

• Quando o número de referências para um objeto é zero, ele é removido da memória.

• Isso era um problema para casos de referências circulares

• O Garbage Collector do PHP 5.3 trata esses casos

Saturday, October 31, 2009

Page 35: PHP 5.3 - What's new?

Garbage Collectorclass Parent { public function __construct() { $this->child = new Child($this); } }

class Child { public function __construct( Parent $parent ) { $this->parent = $parent; } }

Saturday, October 31, 2009

Page 36: PHP 5.3 - What's new?

MINISTÉRIO DA SAÚDE ADVERTE

Os próximos slides são contra-indicados para gestantes,

pessoas com mais de 65 anos ou com problemas de coração.

Saturday, October 31, 2009

Page 37: PHP 5.3 - What's new?

goto

Saturday, October 31, 2009

Page 38: PHP 5.3 - What's new?

goto???é... :-(

goto

Saturday, October 31, 2009

Page 39: PHP 5.3 - What's new?

*não será feita nenhuma demonstração de código por medo de ataque de velociraptors no auditório.

goto

Saturday, October 31, 2009

Page 40: PHP 5.3 - What's new?

Momento lavagem cerebral

Repitam comigo:“GOTO NÃO EXISTE!”

Saturday, October 31, 2009

Page 41: PHP 5.3 - What's new?

E AGORA VOLTAREMOS À

PROGRAMAÇÃO NORMAL

COM AS NOVAS

FEATURES LEGAIS DO

PHP 5.3

Saturday, October 31, 2009

Page 42: PHP 5.3 - What's new?

SPL Datastructures

Saturday, October 31, 2009

Page 43: PHP 5.3 - What's new?

SPL Datastructures• Nas versões anteriores, toda coleção era tratada

como um Array.

• O Array do PHP funciona como uma tabela hash, que associa chaves e valores, onde as chaves podem ser nºs inteiros (sequenciais ou não) ou strings.

• O Array tem tamanho dinâmico e é ajustado de acordo com a demanda

• Algumas funções permitiam simular pilhas (array_push e array_pop) e filas (array_shift e array_unshift) com Arrays

Saturday, October 31, 2009

Page 44: PHP 5.3 - What's new?

SPL Datastructures• SPLDoublyLinkedList

• Adição, remoção, acesso à cabeça e à cauda em O(1)

• Usado na implementação de:• SPLStack

• LIFO• SPLQueue

• FIFO

Saturday, October 31, 2009

Page 45: PHP 5.3 - What's new?

SPL Datastructures• SPLHeap

• SPLMaxHeap• SPLMinHeap• SPLPriorityQueue

Saturday, October 31, 2009

Page 46: PHP 5.3 - What's new?

SPL Datastructures• SPLFixedArray

• Diferenças do array convencional:• Os índices precisam ser inteiros e

sequenciais• O tamanho é estático

• Isso traz ganhos de performance, pois facilita a alocação de memória, iteração e o “seek”.

• SPLObjectStorage• Mapa (key-value)• Pode servir também como um Set de objetos

(chaves sem valor)

Saturday, October 31, 2009

Page 47: PHP 5.3 - What's new?

PHAR

Saturday, October 31, 2009

Page 48: PHP 5.3 - What's new?

PHAR• PHAR é para o PHP o que JAR é para o Java

• PHAR pode transformar vários arquivos em um só

• Facilita a distribuição e execução de aplicações como um único arquivo

• PHAR “entende” os formatos ZIP, TAR e PHAR

• Pode ser manipulado através do Stream Wrapper phar://

• Você pode manipular os arquivos da mesma maneira que faz diretamente no sistema de arquivos de maneira transparente

Saturday, October 31, 2009

Page 49: PHP 5.3 - What's new?

PHARExistem várias maneiras de se usar um PHAR

Executando em php-cli$ php aplicacao.phar

<?phpinclude 'biblioteca.phar';include 'phar://biblioteca2.phar/arquivo.php';?>

Saturday, October 31, 2009

Page 50: PHP 5.3 - What's new?

PHAR<?php

//Criando um PHAR$phar = new Phar('pacote.phar');//Cria um arquivo hello.txt dentro do PHAR com o conteúdo atribuído$phar['hello.txt'] = "Hello World";

//Lendo um PHARecho file_get_contents('phar://pacote.phar/hello.txt');

?>

Saturday, October 31, 2009

Page 51: PHP 5.3 - What's new?

PHAR• Todo PHAR deve conter três (ou quatro) seções

1. Um stub

2. Um manifest descrevendo o conteúdo

3. Os arquivos propriamente ditos

4. [opcional] uma assinatura de verificação de integridade do PHAR

Saturday, October 31, 2009

Page 52: PHP 5.3 - What's new?

Outras coisinhas

Saturday, October 31, 2009

Page 53: PHP 5.3 - What's new?

Outras coisinhas• Suporte em Windows foi melhorado

• Adicionado o nível de erro E_DEPRECATED

• SPL não pode mais ser desabilitado

• Pyrus, o novo instalador do PEAR

• NOWDOC

• Operador ?:

• __callStatic()

• Constante __DIR__

• Bugfixes, bugfixes e bugfixes

Saturday, October 31, 2009

Page 54: PHP 5.3 - What's new?

NOWDOC<?php

$nome = "Felipe";

$heredoc = <<<TEXTOMeu nome é $nomeTEXTO;

echo $heredoc; // Meu nome é Felipe

$nowdoc = <<<'TEXTO'Meu nome é $nomeTEXTO;

echo $nowdoc; // Meu nome é $nome

Saturday, October 31, 2009

Page 55: PHP 5.3 - What's new?

NOWDOC

• NOWDOC está para HEREDOC assim como aspa simples está para aspas duplas

• Variáveis não são avaliadas dentro da expressão

Saturday, October 31, 2009

Page 56: PHP 5.3 - What's new?

Operador ?:

Operador ternário$nome = $_GET['nome'] ? $_GET['nome'] : $valor_default;

Operador ?:$nome = $_GET['nome'] ?: $valor_default;

Saturday, October 31, 2009

Page 57: PHP 5.3 - What's new?

__callStatic()

• __call() trata chamadas de métodos de instância que não foram explicitamente declarados

• __callStatic() é o equivalente para chamadas estáticas

Saturday, October 31, 2009

Page 58: PHP 5.3 - What's new?

__DIR__• includes dentro de includes podem ser um

problema se você usa path relativo

• para se saber o path absoluto do arquivo atual, de maneira dinâmica, usava-se dirname(__FILE__)

• para evitar essa chamada de função, PHP5.3 já traz essa informação na constante __DIR__

Saturday, October 31, 2009

Page 59: PHP 5.3 - What's new?

PHP 6

Saturday, October 31, 2009

Page 60: PHP 5.3 - What's new?

PHP 6

UnicodeInternacionalização

Saturday, October 31, 2009

Page 61: PHP 5.3 - What's new?

Conclusões

Saturday, October 31, 2009

Page 62: PHP 5.3 - What's new?

Conclusões• A “concorrência” fez muito bem ao PHP, pois

deixou a sua comunidade mais exigente

• As mudanças do PHP 5.3 continuam fazendo jus ao “PHP way”: nem sempre bonito, mas sempre prático e eficiente.

• PHP ainda paga caro pelas más escolhas do passado

Saturday, October 31, 2009

Page 63: PHP 5.3 - What's new?

Conclusões• PHP 5.3 provocará, logo logo, uma nova leva de

versões de frameworks (incompatíveis com as anteriores)• Zend Framework 2.0 usará namespaces ao

invés da convenção atual• Symfony 2.0, Cake 2.0,...

Saturday, October 31, 2009

Page 64: PHP 5.3 - What's new?

<?php

echo("Dúvidas?");

$contato = array( "nome" => "Felipe Ribeiro", "email" => "[email protected]", "blog" => "http://feliperibeiro.com", "twitter" => "@felipernb");

var_dump($contato);

?>

Saturday, October 31, 2009

Page 65: PHP 5.3 - What's new?

Referências

• PHP (http://talks.php.net/show/pdxphp09)- Rasmus Lerdorf

• http://php.net/history

• http://php.net/closures

• http://php.net/lsb

• http://php.net/namespaces

• http://php.net/goto

• http://php.net/spl

• http://stackoverflow.com/questions/220658/what-is-the-difference-between-a-closure-and-a-lambda

• http://www.ibm.com/developerworks/opensource/library/os-php-5.3new1/index.html

• http://php.net/ChangeLog-5.php#5.3.0

Saturday, October 31, 2009