4. 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
5. 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
6. 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
8. 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
9. 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
10. PHP 5
<?php
class 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
11. 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
18. Lambdas e Closures
function getSomador($x) {
return function ($y) use ($x) {
return $x + $y;
};
}
$somador = getSomador(10);
echo $somador(5); //15
echo $somador(32); //42
Saturday, October 31, 2009
19. Lambdas e Closures
• 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
Saturday, October 31, 2009
21. Namespaces
Como declarar?
<?php
namespace YahooNews;
class Dir {
...
}
?>
Saturday, October 31, 2009
22. Namespaces
Como usar?
<?php
// usando diretamente
$foo = new YahooNewsDir();
// importando o namespace
use YahooNews;
$foo = new NewsDir();
// renomeando a classe
use YahooNewsDir as YND;
$foo = new YND();
?>
Saturday, October 31, 2009
23. Namespaces
<?php
// FooBar.php
namespace FooBar;
class Baz {
function __construct() {
echo get_called_class();
}
}
?>
Saturday, October 31, 2009
24. Namespaces
<?php
require './FooBar.php';
use FooBar as FB;
$a = new FBBaz(); // FooBarBaz
?>
Saturday, October 31, 2009
25. 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
26. Namespaces
http://php.net/namespaces
Saturday, October 31, 2009
27. Late static
binding
Saturday, October 31, 2009
28. Late static binding
<?php
abstract 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
29. Late static binding
<?php
abstract class ActiveRecord {
public function save() {
$sql = "INSERT INTO ". self::TABLE. "...";
}
...
}
class Post extends ActiveRecord {
A !
const TABLE = 'posts';
IO N
...
N C
FU
}
O
NÃ
$p = new Post();
...
$p->save();
Saturday, October 31, 2009
30. Late static binding
<?php
abstract 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
31. Late static binding
<?php
class 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
32. 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
34. 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
35. Garbage Collector
class Parent
{
public function __construct()
{
$this->child = new Child($this);
}
}
class Child
{
public function __construct( Parent $parent )
{
$this->parent = $parent;
}
}
Saturday, October 31, 2009
36. 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
43. 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
44. 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
46. 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
48. 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
49. PHAR
Existem várias maneiras de se usar um PHAR
Executando em php-cli
$ php aplicacao.phar
<?php
include 'biblioteca.phar';
include 'phar://biblioteca2.phar/
arquivo.php';
?>
Saturday, October 31, 2009
50. 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 PHAR
echo file_get_contents('phar://pacote.phar/
hello.txt');
?>
Saturday, October 31, 2009
51. 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
53. 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
54. NOWDOC
<?php
$nome = "Felipe";
$heredoc = <<<TEXTO
Meu nome é $nome
TEXTO;
echo $heredoc; // Meu nome é Felipe
$nowdoc = <<<'TEXTO'
Meu nome é $nome
TEXTO;
echo $nowdoc; // Meu nome é $nome
Saturday, October 31, 2009
55. 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
57. __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
58. __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
62. 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
63. 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