SlideShare uma empresa Scribd logo
1 de 49
Baixar para ler offline
PHP 7
Guilherme Blanco
Guilherme Blanco
http://github.com/guilhermeblanco
@guilhermeblanco
Guilherme Blanco
http://github.com/guilhermeblanco
@guilhermeblanco
http://hhvm.com/blog/9293/lockdown-results-and-hhvm-performance
Agenda
• Mudanças para o usuário
• Mudanças internas
• PHP.NEXT
Mudanças para o usuário
• Quebras de compatibilidade
• Novos operadores
• Erros e exceções
• Indução de tipo escalar (Scalar type hint)
• Declaração de tipo de retorno (Return type hint)
• Classes anônimas (Anonymous classes)
• Palavras-chave semi-reservadas
Quebras de compatibilidade
<% /* ... */ %>
<%= /* ... */ %>
<script language="php">/* ... */</script>
<? /* ... */ ?>
<?= /* ... */ ?>
<?php /* ... */ ?>
• Tags alternativas do PHP
Quebras de compatibilidade
• Construtores do PHP 4
1 class Post {
2 public function post() {
3 echo 'post';
4 }
5 }
$post = new Post();
$post = new DomainPost();
1 namespace Domain {
2 class Post {
3 public function post() {
4 echo 'post';
5 }
6 }
7 }
Quebras de compatibilidade
• Mudanças de sintaxe (Uniform variable syntax)
• Novas combinações de operadores
$foo()['bar']()
[$obj1, $obj2][0]->prop
$foo->bar()::baz()
$foo->bar()()
(function () {})()
Quebras de compatibilidade
• Mudanças de sintaxe (Uniform variable syntax)
• Acesso indireto à variáveis, propriedades e métodos
Expressão Interpretação no PHP 5 Interpretação no PHP 7
$$foo['bar']['baz'] ${$foo['bar']['baz']} ($$foo)['bar']['baz']
$foo->$bar['baz'] $foo->{$bar['baz']} ($foo->$bar)['baz']
$foo->$bar['baz']() $foo->{$bar['baz']}() ($foo->$bar)['baz']()
Foo::$bar['baz']() Foo::{$bar['baz']}() (Foo::$bar)['baz']()
Quebras de compatibilidade
• Server APIs removidas:

aolserver, apache,
apache_hooks, apache2filter,
caudium, continuity, isapi, milter,
nsapi, phttpd, pi3web, roxen,
thttpd, tux, webjames
• Extensões depreciadas (PECL): 

ereg, mssql, mysql, sybase_ct
Novos operadores
• Null coalesce operator (??)
• Spaceship operator (<=>)
• Group use
• Unicode escape syntax (u)
Novos operadores
• Null coalesce operator (??)
$page = $_GET['page'] ?: 1;
if (isset($_GET['page'])) {
$page = $_GET['page'];
} else {
$page = 1;
}
$page = isset($_GET['page'])
? $_GET['page']
: 1
;
$page = $_GET['page'] ?? 1;
Novos operadores
• Operador de comparação combinado (Spaceship operator) (<=>)
1 // Integers
2 echo 1 <=> 1; // 0
3 echo 2 <=> 1; // 1
4 echo 1 <=> 2; // -1
5
6 // Floats
7 echo 1.5 <=> 1.5; // 0
8 echo 2.5 <=> 1.5; // 1
9 echo 1.5 <=> 2.5; // -1
10
11 // Strings
12 echo 'a' <=> 'a'; // 0
13 echo 'z' <=> 'a'; // 1
14 echo 'a' <=> 'z'; // -1
15
16 echo 'zz' <=> 'aa'; // 1
17 echo 'a' <=> 'aa'; // -1
Novos operadores
• Group use
use EblockDomainDirectoryEntity{
Consigner,
Location as ConsignerLocation,
User
};
use EblockDomainDirectory{
DTO{
ConsignerUpdate as UpdateConsigner
},
Entity{
Consigner,
Location,
User
}
};
Novos operadores
• Unicode escape syntax (u)
❤ (0x2764)
// <3 no PHP 5
$char = html_entity_decode('&#x10084', 0, 'UTF-8');
$char = mb_convert_encoding('&#x10084', 'UTF-8', 'HTML-ENTITIES');
$char = json_decode('"u2764"');
// <3 no PHP 7
$char = "u2764";
Erros e exceções
• Usuário pode capturar qualquer chamada que possa gerar erros fatais
• A maioria dos error E_RECOVERABLE viraram Exceptions
• Erros E_STRICT foram re-classificados como E_WARN e E_NOTICE
• Erros fatais são ou herdam a classe "Error"
• Erros de análise sintática geram "ParseError"
• Ambos "Error" e "Exception" implementam a interface "Throwable"
Erros e exceções
Erros e exceções
1 echo 'PHP ' . phpversion() . PHP_EOL;
2
3 try {
4 $foo = new foo();
5 } catch (Exception $e) {
6 echo 'I am an exception: ' . $e->getMessage() . PHP_EOL;
7 } catch (Error $e) {
8 echo 'I am an error: ' . $e->getMessage() . PHP_EOL;
9 } catch (Throwable $t) {
10 echo 'I am throwable: ' . $t->getMessage() . PHP_EOL;
11 }
12
13 // PHP 5.6.19
14 // Fatal error: Class 'foo' not found in
15 // Documents/PHP7/throwable.php on line 5
16
17 // PHP 7.0.4
18 // I am an error: Class 'foo' not found
Indução de tipo escalar
• Funciona de duas formas distintas:
• Weak mode (Coercivo)
• Strict (Forte)
declare(strict_types=1);
Indução de tipo escalar
Tipo declarado int float string bool object
int yes yes* yes† yes no
float yes yes yes† yes no
string yes yes yes yes yes‡
bool yes yes yes yes no
* Somente pontos flutuantes não-NaN e entre PHP_INT_MIN e PHP_INT_MAX serão aceitos.
† Se for uma string numérica
‡ Somente se o objeto tiver o método __toString()
function setEnabled(bool $enabled) { /* ... */ }
Indução de tipo escalar
1 declare(strict_types=1);
2
3 function welcome(string $name) {
4 echo 'Welcome to the show, ' . $name;
5 }
6
7 welcome('Guilherme');
8 // Welcome to the show, Guilherme
9
10 welcome(42);
11 // TypeError: Argument 1 passed to welcome()
12 // must be of the type string, integer given
Declaração de tipo de retorno
function getCreator(): UserInterface {
return $this->getPost()->getAuthor();
}
function getAuthor(): UserInterface {
return 'Guilherme Blanco';
}
getAuthor();
// TypeError: Return value of getAuthor() must be
// an instance of UserInterface, string returned
Classes anônimas
// Pre PHP 7
class EchoLogger implements LoggerInterface {
public function log($message) {
echo $message;
}
}
$application->setLogger(new Logger());
// PHP 7, seu lindo! <3
$application->setLogger(new class () implements LoggerInterface {
public function log(string $message) {
echo $message;
}
});
Palavras-chave semi-reservadas
• abstract
• and
• array
• as
• break
• callable
• case
• catch
• class*
• clone
• const
• continue
• declare
• default
• die
• do
• global
• goto
• if
• implements
• include
• include_once
• instanceof
• insteadof
• interface
• list
• namespace
• new
• or
• parent
• print
• private
• protected
• public
• require
• require_once
• return
• self
• static
• switch
• throw
• trait
• try
• use
• var
• while
• xor
• yield
• echo
• else
• elseif
• enddeclare
• endfor
• endforeach
• endif
• endswitch
• endwhile
• exit
• extends
• final
• finally
• for
• foreach
• function
Palavras-chave semi-reservadas
1 namespace HTTP
2 {
3 class StatusCode
4 {
5 const CONTINUE = 100;
6 const SWITCHING_PROTOCOLS = 101;
7 // ...
8 }
9 }
Palavras-chave semi-reservadas
1 $queryBuilder = $repository->createQueryBuilder('e');
2
3 $queryBuilder
4 ->where()
5 ->and()
6 ->field('e.projeto')
7 ->not()
8 ->like('%secreto%')
9 ->end()
10 ->field('e.prioridade')
11 ->gt(9)
12 ->end()
13 ->end()
14 ->or()
15 ->field('e.codigo')
16 ->in([4, 5, 6])
17 ->end()
18 ->end()
19 ->end()
20 ;
Mudanças internas
• Árvore de sintaxe abstrata (Abstract Syntax Tree)
• Suporte completo a 64 bits
• Large File Support (LFS)
• Strings maiores que 231
• Suporte a inteiros de 64 bits
• Novo gerenciamento de memória
• ZVALs são alocados na stack
• refcount mais preciso
• Nova implementação de segurança sobre threads
• Thread safety no PHP 5 implicava numa penalização de performance em ~20%
• Otimização de estruturas de dados
Árvore de sintaxe abstrata
<?php
$a = 42;
$b = 24;
echo $a + $b;
<?php T_OPEN_TAG

$a T_VARIABLE

= T_EQUALS

42 T_LNUMBER

; T_SEMICOLON

$b T_VARIABLE

= T_EQUALS

24 T_LNUMBER

; T_SEMICOLON

echo T_ECHO

$a T_VARIABLE

+ T_PLUS

$b T_VARIABLE

; T_SEMICOLON
lex
ASSIGN $a 42

ASSIGN $b 24

ADD $a $b ~0

ECHO ~0

RETURN 1
parse + compile
Árvore de sintaxe abstrata
<?php
$a = 42;
$b = 24;
echo $a + $b;
<?php T_OPEN_TAG

$a T_VARIABLE

= T_EQUALS

42 T_LNUMBER

; T_SEMICOLON

$b T_VARIABLE

= T_EQUALS

24 T_LNUMBER

; T_SEMICOLON

echo T_ECHO

$a T_VARIABLE

+ T_PLUS

$b T_VARIABLE

; T_SEMICOLON
lex
stmts
assign assign echo
42 24 +
$a $b $a $b
var var
parse
ASSIGN $a 42

ASSIGN $b 24

ADD $a $b ~0

ECHO ~0

RETURN 1
compile
Otimização de estruturas de dados
• ~20% do tempo gasto no PHP 5 era referente à alocação de memória
• No PHP 7, foi reduzido o número de alocações
• No PHP 7, foi reduzido o consumo de memória
• No PHP 7, foi reduzido o número de indicações
• O motor de execução agora utiliza stack push e gerencia argumentos
• Chamada pra funções foram drasticamente refatoradas
• Variáveis no PHP 7 são cacheadas de forma mais eficiente
• String são refcounted
Otimização de estruturas de dados
• ZVAL no PHP 5
1 typedef union _zvalue_value {
2 long lval;
3 double dval;
4 struct {
5 char *val;
6 int len;
7 } str;
8 HashTable *ht;
9 zend_object_value obj;
10 zend_ast *ast;
11 } zvalue_value;
1 struct _zval_struct {
2 zvalue_value value;
4 zend_uint refcount__gc;
5 zend_uchar type;
6 zend_uchar is_ref__gc;
7 } zval;
ZVAL no PHP 5
value

ZVAL
ty
Crédito: Nikita Popov
ZVAL no PHP 5
value (simple):

null, bool, int, float
ZVAL
ty
Crédito: Nikita Popov
ZVAL no PHP 5
value (complex):

ZVAL
ty
complex data structure:

string, array, object
Crédito: Nikita Popov
ZVAL no PHP 5
1 $a = [];
zval *$a value (complex):

ZVAL
ty
complex data structure:

string, array, object
refcount = 1
Crédito: Nikita Popov
ZVAL no PHP 5
zval *$a
1 $a = [];
2 $b = $a;
value (complex):

ZVAL
ty
complex data structure:

string, array, object
refcount = 1
Crédito: Nikita Popov
ZVAL no PHP 5
zval *$a
1 $a = [];
2 $b = $a;
value (complex):

ZVAL
ty
complex data structure:

string, array, object
refcount = 2
zval *$b
Crédito: Nikita Popov
1 typedef union _zend_value {
2 zend_long lval;
3 double dval;
4 zend_refcounted *counted;
5 zend_string *str;
6 zend_array *arr;
7 zend_object *obj;
8 zend_resource *res;
9 zend_reference *ref;
10 zend_ast_ref *ast;
11 zval *zv;
12 void *ptr;
13 zend_class_entry *ce;
14 zend_function *func;
15 struct {
16 uint32_t w1;
17 uint32_t w2;
18 } ww;
19 } zend_value;
1 struct _zval_struct {
2 zend_value value;
3 union {
4 struct {
5 ZEND_ENDIAN_LOHI_4(
6 zend_uchar type,
7 zend_uchar type_flags,
8 zend_uchar const_flags,
9 zend_uchar reserved)
10 } v;
11 uint32_t type_info;
12 } u1;
13 union {
14 uint32_t var_flags;
15 uint32_t next;
16 uint32_t cache_slot;
17 uint32_t lineno;
18 uint32_t num_args;
19 uint32_t fe_pos;
20 uint32_t fe_iter_idx;
21 uint32_t access_flags;
22 } u2;
23 } zval;
ZVAL no PHP 7
ZVAL no PHP 7
zval *$a
1 $a = [];
2 $b = $a;
value (complex):

ZVAL
ty
zval *$b
complex data structure:

string, array, object
refcount = 2
Crédito: Nikita Popov
ZVAL no PHP 7
zval *$a
1 $a = [];
2 $b = $a;
zval *$b
complex data structure:

string, array, object
refcount = 2
ZVAL
value (complex):

type_info
Crédito: Nikita Popov
ZVAL no PHP 7
$a
1 $a = [];
2 $b = $a;
$b
complex data structure:

string, array, object
refcount = 2
value (complex):

type_info
value (complex):

type_info
Crédito: Nikita Popov
PHP 5 vs. PHP 7 ZVAL
zval *
value (simple):

null, bool, int, float
tyrefcount = 1
1 alocação de memória
1 nível de indireção
40 bytes
value (simple):

null, bool, int, float
type_info
sem alocações de memória
sem indireções
16 bytes
PHP 5 vs. PHP 7 ZVAL
zval *
complex data structure:

string, array, object
value (complex):

tyrefcount = 1
2 alocações de memória
2 níveis de indireção
40 bytes
complex data structure:

string, array, object
refcount = 1
value (complex):

type_info
1 alocação de memória
1 nível de indireção
24 bytes
PHP 5 vs. PHP 7 Objetos
zval
object store bucket
object real
tabela de propriedades
valor da propriedade
zval
objeto real
+
tabela de propriedades

(incluindo valores)
PHP 5 PHP 7
Alocações 2 + 1 / propriedade 1 + 0 / propriedade
Tamanho 96 + 40 / propriedade 48 + 16 / propriedade
Indireções 4 1
PHP.NEXT
• Parâmetros nomeados (Named parameters)
• Visibilidade de classes (Class Visibility)
• Tipagem de propriedades (Typed properties)
• Anotações (Annotations)
• Coleções (Collections)
• Estruturas genéricas (Generics)
Perguntas?
Thanks! =)
http://github.com/guilhermeblanco
@guilhermeblanco

Mais conteúdo relacionado

Mais procurados

Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Michael Castillo Granados
 
Memcached, Gearman e Sphinx
Memcached, Gearman e SphinxMemcached, Gearman e Sphinx
Memcached, Gearman e SphinxElton Minetto
 
PHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PHP e PostgreSQL: Um é pouco, dois é bom, três é demaisPHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PHP e PostgreSQL: Um é pouco, dois é bom, três é demaisFabrízio Mello
 
LabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - FunçõesLabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - FunçõesCarlos Santos
 
Desenvolvimento Rápido de Programas Linha de Comando
Desenvolvimento Rápido de Programas Linha de ComandoDesenvolvimento Rápido de Programas Linha de Comando
Desenvolvimento Rápido de Programas Linha de Comandogarux
 
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPy
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPyDesenvolvendo uma Aplicação WEB usando o Python e o CherryPy
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPyantonio sérgio nogueira
 
(Portuguese) Java EE Poliglota
(Portuguese) Java EE Poliglota(Portuguese) Java EE Poliglota
(Portuguese) Java EE PoliglotaPhil Calçado
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Elton Minetto
 
Usando POP com Programação Funcional
Usando POP com Programação FuncionalUsando POP com Programação Funcional
Usando POP com Programação FuncionalTales Andrade
 

Mais procurados (20)

Python 08
Python 08Python 08
Python 08
 
Php
PhpPhp
Php
 
PHP fora da Web
PHP fora da WebPHP fora da Web
PHP fora da Web
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014
 
Java script aula 05 - funções
Java script   aula 05 - funçõesJava script   aula 05 - funções
Java script aula 05 - funções
 
Zephir
ZephirZephir
Zephir
 
Python 03
Python 03Python 03
Python 03
 
Linguagem PHP
Linguagem PHPLinguagem PHP
Linguagem PHP
 
Memcached, Gearman e Sphinx
Memcached, Gearman e SphinxMemcached, Gearman e Sphinx
Memcached, Gearman e Sphinx
 
PHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PHP e PostgreSQL: Um é pouco, dois é bom, três é demaisPHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PHP e PostgreSQL: Um é pouco, dois é bom, três é demais
 
Java script aula 08 - formulários
Java script   aula 08 - formuláriosJava script   aula 08 - formulários
Java script aula 08 - formulários
 
LabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - FunçõesLabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - Funções
 
Desenvolvimento Rápido de Programas Linha de Comando
Desenvolvimento Rápido de Programas Linha de ComandoDesenvolvimento Rápido de Programas Linha de Comando
Desenvolvimento Rápido de Programas Linha de Comando
 
PHP GERAL
PHP GERALPHP GERAL
PHP GERAL
 
PHP-CLI em 7 passos
PHP-CLI em 7 passosPHP-CLI em 7 passos
PHP-CLI em 7 passos
 
Python 04
Python 04Python 04
Python 04
 
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPy
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPyDesenvolvendo uma Aplicação WEB usando o Python e o CherryPy
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPy
 
(Portuguese) Java EE Poliglota
(Portuguese) Java EE Poliglota(Portuguese) Java EE Poliglota
(Portuguese) Java EE Poliglota
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2
 
Usando POP com Programação Funcional
Usando POP com Programação FuncionalUsando POP com Programação Funcional
Usando POP com Programação Funcional
 

Semelhante a PHP 7: principais mudanças e novidades

Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3klaussilveira
 
SIMCIT 2013 - Mini-curso PHP
SIMCIT 2013 - Mini-curso PHPSIMCIT 2013 - Mini-curso PHP
SIMCIT 2013 - Mini-curso PHPJonata Weber
 
55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil55 New Things in Java 7 - Brazil
55 New Things in Java 7 - BrazilStephen Chin
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOWesley Lemos
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAThiago Cifani
 
Relato Sobre a Migração de uma Aplicação Legada para Rails
Relato Sobre a Migração de uma Aplicação Legada para RailsRelato Sobre a Migração de uma Aplicação Legada para Rails
Relato Sobre a Migração de uma Aplicação Legada para RailsCássio Marques
 
Ruby e Erlang de mãos dadas
Ruby e Erlang de mãos dadasRuby e Erlang de mãos dadas
Ruby e Erlang de mãos dadasÉverton Ribeiro
 
PHP like a super hero
PHP like a super heroPHP like a super hero
PHP like a super heroElton Minetto
 
Groovy na plataforma Java
Groovy na plataforma JavaGroovy na plataforma Java
Groovy na plataforma JavaJoão Lourenço
 
(A06) LabMM3 - JavaScript
(A06) LabMM3 - JavaScript(A06) LabMM3 - JavaScript
(A06) LabMM3 - JavaScriptCarlos Santos
 
Proxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesProxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesStanislaw Pusep
 
Curso JavaScript - Aula de Introdução como Programar
Curso JavaScript - Aula de Introdução como ProgramarCurso JavaScript - Aula de Introdução como Programar
Curso JavaScript - Aula de Introdução como ProgramarTiago Antônio da Silva
 

Semelhante a PHP 7: principais mudanças e novidades (20)

TDC 2016 - PHP7
TDC 2016 - PHP7TDC 2016 - PHP7
TDC 2016 - PHP7
 
Java 9, 10 e ... 11
Java 9, 10 e ... 11Java 9, 10 e ... 11
Java 9, 10 e ... 11
 
Migrando para o PHP 5
Migrando para o PHP 5Migrando para o PHP 5
Migrando para o PHP 5
 
Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3
 
SIMCIT 2013 - Mini-curso PHP
SIMCIT 2013 - Mini-curso PHPSIMCIT 2013 - Mini-curso PHP
SIMCIT 2013 - Mini-curso PHP
 
55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POO
 
Sapo Sessions PHP
Sapo Sessions PHPSapo Sessions PHP
Sapo Sessions PHP
 
Dev Ext PHP
Dev Ext PHPDev Ext PHP
Dev Ext PHP
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVA
 
Relato Sobre a Migração de uma Aplicação Legada para Rails
Relato Sobre a Migração de uma Aplicação Legada para RailsRelato Sobre a Migração de uma Aplicação Legada para Rails
Relato Sobre a Migração de uma Aplicação Legada para Rails
 
PHP 5.3 - Funções
PHP 5.3 - FunçõesPHP 5.3 - Funções
PHP 5.3 - Funções
 
Ruby e Erlang de mãos dadas
Ruby e Erlang de mãos dadasRuby e Erlang de mãos dadas
Ruby e Erlang de mãos dadas
 
PHP like a super hero
PHP like a super heroPHP like a super hero
PHP like a super hero
 
Groovy na plataforma Java
Groovy na plataforma JavaGroovy na plataforma Java
Groovy na plataforma Java
 
(A06) LabMM3 - JavaScript
(A06) LabMM3 - JavaScript(A06) LabMM3 - JavaScript
(A06) LabMM3 - JavaScript
 
Principais novidades do PHP7
Principais novidades do PHP7Principais novidades do PHP7
Principais novidades do PHP7
 
Desenvolvimento de Extensões PECL
Desenvolvimento de Extensões PECLDesenvolvimento de Extensões PECL
Desenvolvimento de Extensões PECL
 
Proxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesProxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testes
 
Curso JavaScript - Aula de Introdução como Programar
Curso JavaScript - Aula de Introdução como ProgramarCurso JavaScript - Aula de Introdução como Programar
Curso JavaScript - Aula de Introdução como Programar
 

Mais de Guilherme Blanco

PHP for Adults: Clean Code and Object Calisthenics
PHP for Adults: Clean Code and Object CalisthenicsPHP for Adults: Clean Code and Object Calisthenics
PHP for Adults: Clean Code and Object CalisthenicsGuilherme Blanco
 
PHP para Adultos: Clean Code e Object Calisthenics
PHP para Adultos: Clean Code e Object CalisthenicsPHP para Adultos: Clean Code e Object Calisthenics
PHP para Adultos: Clean Code e Object CalisthenicsGuilherme Blanco
 
ORM dont kill your DB, developers do
ORM dont kill your DB, developers doORM dont kill your DB, developers do
ORM dont kill your DB, developers doGuilherme Blanco
 
Object Calisthenics Applied to PHP
Object Calisthenics Applied to PHPObject Calisthenics Applied to PHP
Object Calisthenics Applied to PHPGuilherme Blanco
 
PHPubSP Object Calisthenics aplicado ao PHP
PHPubSP Object Calisthenics aplicado ao PHPPHPubSP Object Calisthenics aplicado ao PHP
PHPubSP Object Calisthenics aplicado ao PHPGuilherme Blanco
 
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHP
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHPIPC2010SE Doctrine2 Enterprise Persistence Layer for PHP
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHPGuilherme Blanco
 
Doctrine 2.0: A evolução da persistência em PHP
Doctrine 2.0: A evolução da persistência em PHPDoctrine 2.0: A evolução da persistência em PHP
Doctrine 2.0: A evolução da persistência em PHPGuilherme Blanco
 
Doctrine 2.0 Enterprise Persistence Layer for PHP
Doctrine 2.0 Enterprise Persistence Layer for PHPDoctrine 2.0 Enterprise Persistence Layer for PHP
Doctrine 2.0 Enterprise Persistence Layer for PHPGuilherme Blanco
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 

Mais de Guilherme Blanco (12)

Enterprise php
Enterprise phpEnterprise php
Enterprise php
 
PHP for Adults: Clean Code and Object Calisthenics
PHP for Adults: Clean Code and Object CalisthenicsPHP for Adults: Clean Code and Object Calisthenics
PHP for Adults: Clean Code and Object Calisthenics
 
PHP para Adultos: Clean Code e Object Calisthenics
PHP para Adultos: Clean Code e Object CalisthenicsPHP para Adultos: Clean Code e Object Calisthenics
PHP para Adultos: Clean Code e Object Calisthenics
 
ORM dont kill your DB, developers do
ORM dont kill your DB, developers doORM dont kill your DB, developers do
ORM dont kill your DB, developers do
 
Object Calisthenics Applied to PHP
Object Calisthenics Applied to PHPObject Calisthenics Applied to PHP
Object Calisthenics Applied to PHP
 
PHPubSP Object Calisthenics aplicado ao PHP
PHPubSP Object Calisthenics aplicado ao PHPPHPubSP Object Calisthenics aplicado ao PHP
PHPubSP Object Calisthenics aplicado ao PHP
 
Javascript para adultos
Javascript para adultosJavascript para adultos
Javascript para adultos
 
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHP
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHPIPC2010SE Doctrine2 Enterprise Persistence Layer for PHP
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHP
 
Doctrine 2.0: A evolução da persistência em PHP
Doctrine 2.0: A evolução da persistência em PHPDoctrine 2.0: A evolução da persistência em PHP
Doctrine 2.0: A evolução da persistência em PHP
 
PHP, Daemons e Multimedia
PHP, Daemons e MultimediaPHP, Daemons e Multimedia
PHP, Daemons e Multimedia
 
Doctrine 2.0 Enterprise Persistence Layer for PHP
Doctrine 2.0 Enterprise Persistence Layer for PHPDoctrine 2.0 Enterprise Persistence Layer for PHP
Doctrine 2.0 Enterprise Persistence Layer for PHP
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 

PHP 7: principais mudanças e novidades

  • 2.
  • 6. Agenda • Mudanças para o usuário • Mudanças internas • PHP.NEXT
  • 7. Mudanças para o usuário • Quebras de compatibilidade • Novos operadores • Erros e exceções • Indução de tipo escalar (Scalar type hint) • Declaração de tipo de retorno (Return type hint) • Classes anônimas (Anonymous classes) • Palavras-chave semi-reservadas
  • 8. Quebras de compatibilidade <% /* ... */ %> <%= /* ... */ %> <script language="php">/* ... */</script> <? /* ... */ ?> <?= /* ... */ ?> <?php /* ... */ ?> • Tags alternativas do PHP
  • 9. Quebras de compatibilidade • Construtores do PHP 4 1 class Post { 2 public function post() { 3 echo 'post'; 4 } 5 } $post = new Post(); $post = new DomainPost(); 1 namespace Domain { 2 class Post { 3 public function post() { 4 echo 'post'; 5 } 6 } 7 }
  • 10. Quebras de compatibilidade • Mudanças de sintaxe (Uniform variable syntax) • Novas combinações de operadores $foo()['bar']() [$obj1, $obj2][0]->prop $foo->bar()::baz() $foo->bar()() (function () {})()
  • 11. Quebras de compatibilidade • Mudanças de sintaxe (Uniform variable syntax) • Acesso indireto à variáveis, propriedades e métodos Expressão Interpretação no PHP 5 Interpretação no PHP 7 $$foo['bar']['baz'] ${$foo['bar']['baz']} ($$foo)['bar']['baz'] $foo->$bar['baz'] $foo->{$bar['baz']} ($foo->$bar)['baz'] $foo->$bar['baz']() $foo->{$bar['baz']}() ($foo->$bar)['baz']() Foo::$bar['baz']() Foo::{$bar['baz']}() (Foo::$bar)['baz']()
  • 12. Quebras de compatibilidade • Server APIs removidas:
 aolserver, apache, apache_hooks, apache2filter, caudium, continuity, isapi, milter, nsapi, phttpd, pi3web, roxen, thttpd, tux, webjames • Extensões depreciadas (PECL): 
 ereg, mssql, mysql, sybase_ct
  • 13. Novos operadores • Null coalesce operator (??) • Spaceship operator (<=>) • Group use • Unicode escape syntax (u)
  • 14. Novos operadores • Null coalesce operator (??) $page = $_GET['page'] ?: 1; if (isset($_GET['page'])) { $page = $_GET['page']; } else { $page = 1; } $page = isset($_GET['page']) ? $_GET['page'] : 1 ; $page = $_GET['page'] ?? 1;
  • 15. Novos operadores • Operador de comparação combinado (Spaceship operator) (<=>) 1 // Integers 2 echo 1 <=> 1; // 0 3 echo 2 <=> 1; // 1 4 echo 1 <=> 2; // -1 5 6 // Floats 7 echo 1.5 <=> 1.5; // 0 8 echo 2.5 <=> 1.5; // 1 9 echo 1.5 <=> 2.5; // -1 10 11 // Strings 12 echo 'a' <=> 'a'; // 0 13 echo 'z' <=> 'a'; // 1 14 echo 'a' <=> 'z'; // -1 15 16 echo 'zz' <=> 'aa'; // 1 17 echo 'a' <=> 'aa'; // -1
  • 16. Novos operadores • Group use use EblockDomainDirectoryEntity{ Consigner, Location as ConsignerLocation, User }; use EblockDomainDirectory{ DTO{ ConsignerUpdate as UpdateConsigner }, Entity{ Consigner, Location, User } };
  • 17. Novos operadores • Unicode escape syntax (u) ❤ (0x2764) // <3 no PHP 5 $char = html_entity_decode('&#x10084', 0, 'UTF-8'); $char = mb_convert_encoding('&#x10084', 'UTF-8', 'HTML-ENTITIES'); $char = json_decode('"u2764"'); // <3 no PHP 7 $char = "u2764";
  • 18. Erros e exceções • Usuário pode capturar qualquer chamada que possa gerar erros fatais • A maioria dos error E_RECOVERABLE viraram Exceptions • Erros E_STRICT foram re-classificados como E_WARN e E_NOTICE • Erros fatais são ou herdam a classe "Error" • Erros de análise sintática geram "ParseError" • Ambos "Error" e "Exception" implementam a interface "Throwable"
  • 20. Erros e exceções 1 echo 'PHP ' . phpversion() . PHP_EOL; 2 3 try { 4 $foo = new foo(); 5 } catch (Exception $e) { 6 echo 'I am an exception: ' . $e->getMessage() . PHP_EOL; 7 } catch (Error $e) { 8 echo 'I am an error: ' . $e->getMessage() . PHP_EOL; 9 } catch (Throwable $t) { 10 echo 'I am throwable: ' . $t->getMessage() . PHP_EOL; 11 } 12 13 // PHP 5.6.19 14 // Fatal error: Class 'foo' not found in 15 // Documents/PHP7/throwable.php on line 5 16 17 // PHP 7.0.4 18 // I am an error: Class 'foo' not found
  • 21. Indução de tipo escalar • Funciona de duas formas distintas: • Weak mode (Coercivo) • Strict (Forte) declare(strict_types=1);
  • 22. Indução de tipo escalar Tipo declarado int float string bool object int yes yes* yes† yes no float yes yes yes† yes no string yes yes yes yes yes‡ bool yes yes yes yes no * Somente pontos flutuantes não-NaN e entre PHP_INT_MIN e PHP_INT_MAX serão aceitos. † Se for uma string numérica ‡ Somente se o objeto tiver o método __toString() function setEnabled(bool $enabled) { /* ... */ }
  • 23. Indução de tipo escalar 1 declare(strict_types=1); 2 3 function welcome(string $name) { 4 echo 'Welcome to the show, ' . $name; 5 } 6 7 welcome('Guilherme'); 8 // Welcome to the show, Guilherme 9 10 welcome(42); 11 // TypeError: Argument 1 passed to welcome() 12 // must be of the type string, integer given
  • 24. Declaração de tipo de retorno function getCreator(): UserInterface { return $this->getPost()->getAuthor(); } function getAuthor(): UserInterface { return 'Guilherme Blanco'; } getAuthor(); // TypeError: Return value of getAuthor() must be // an instance of UserInterface, string returned
  • 25. Classes anônimas // Pre PHP 7 class EchoLogger implements LoggerInterface { public function log($message) { echo $message; } } $application->setLogger(new Logger()); // PHP 7, seu lindo! <3 $application->setLogger(new class () implements LoggerInterface { public function log(string $message) { echo $message; } });
  • 26. Palavras-chave semi-reservadas • abstract • and • array • as • break • callable • case • catch • class* • clone • const • continue • declare • default • die • do • global • goto • if • implements • include • include_once • instanceof • insteadof • interface • list • namespace • new • or • parent • print • private • protected • public • require • require_once • return • self • static • switch • throw • trait • try • use • var • while • xor • yield • echo • else • elseif • enddeclare • endfor • endforeach • endif • endswitch • endwhile • exit • extends • final • finally • for • foreach • function
  • 27. Palavras-chave semi-reservadas 1 namespace HTTP 2 { 3 class StatusCode 4 { 5 const CONTINUE = 100; 6 const SWITCHING_PROTOCOLS = 101; 7 // ... 8 } 9 }
  • 28. Palavras-chave semi-reservadas 1 $queryBuilder = $repository->createQueryBuilder('e'); 2 3 $queryBuilder 4 ->where() 5 ->and() 6 ->field('e.projeto') 7 ->not() 8 ->like('%secreto%') 9 ->end() 10 ->field('e.prioridade') 11 ->gt(9) 12 ->end() 13 ->end() 14 ->or() 15 ->field('e.codigo') 16 ->in([4, 5, 6]) 17 ->end() 18 ->end() 19 ->end() 20 ;
  • 29. Mudanças internas • Árvore de sintaxe abstrata (Abstract Syntax Tree) • Suporte completo a 64 bits • Large File Support (LFS) • Strings maiores que 231 • Suporte a inteiros de 64 bits • Novo gerenciamento de memória • ZVALs são alocados na stack • refcount mais preciso • Nova implementação de segurança sobre threads • Thread safety no PHP 5 implicava numa penalização de performance em ~20% • Otimização de estruturas de dados
  • 30. Árvore de sintaxe abstrata <?php $a = 42; $b = 24; echo $a + $b; <?php T_OPEN_TAG
 $a T_VARIABLE
 = T_EQUALS
 42 T_LNUMBER
 ; T_SEMICOLON
 $b T_VARIABLE
 = T_EQUALS
 24 T_LNUMBER
 ; T_SEMICOLON
 echo T_ECHO
 $a T_VARIABLE
 + T_PLUS
 $b T_VARIABLE
 ; T_SEMICOLON lex ASSIGN $a 42
 ASSIGN $b 24
 ADD $a $b ~0
 ECHO ~0
 RETURN 1 parse + compile
  • 31. Árvore de sintaxe abstrata <?php $a = 42; $b = 24; echo $a + $b; <?php T_OPEN_TAG
 $a T_VARIABLE
 = T_EQUALS
 42 T_LNUMBER
 ; T_SEMICOLON
 $b T_VARIABLE
 = T_EQUALS
 24 T_LNUMBER
 ; T_SEMICOLON
 echo T_ECHO
 $a T_VARIABLE
 + T_PLUS
 $b T_VARIABLE
 ; T_SEMICOLON lex stmts assign assign echo 42 24 + $a $b $a $b var var parse ASSIGN $a 42
 ASSIGN $b 24
 ADD $a $b ~0
 ECHO ~0
 RETURN 1 compile
  • 32. Otimização de estruturas de dados • ~20% do tempo gasto no PHP 5 era referente à alocação de memória • No PHP 7, foi reduzido o número de alocações • No PHP 7, foi reduzido o consumo de memória • No PHP 7, foi reduzido o número de indicações • O motor de execução agora utiliza stack push e gerencia argumentos • Chamada pra funções foram drasticamente refatoradas • Variáveis no PHP 7 são cacheadas de forma mais eficiente • String são refcounted
  • 33. Otimização de estruturas de dados • ZVAL no PHP 5 1 typedef union _zvalue_value { 2 long lval; 3 double dval; 4 struct { 5 char *val; 6 int len; 7 } str; 8 HashTable *ht; 9 zend_object_value obj; 10 zend_ast *ast; 11 } zvalue_value; 1 struct _zval_struct { 2 zvalue_value value; 4 zend_uint refcount__gc; 5 zend_uchar type; 6 zend_uchar is_ref__gc; 7 } zval;
  • 34. ZVAL no PHP 5 value
 ZVAL ty Crédito: Nikita Popov
  • 35. ZVAL no PHP 5 value (simple):
 null, bool, int, float ZVAL ty Crédito: Nikita Popov
  • 36. ZVAL no PHP 5 value (complex):
 ZVAL ty complex data structure:
 string, array, object Crédito: Nikita Popov
  • 37. ZVAL no PHP 5 1 $a = []; zval *$a value (complex):
 ZVAL ty complex data structure:
 string, array, object refcount = 1 Crédito: Nikita Popov
  • 38. ZVAL no PHP 5 zval *$a 1 $a = []; 2 $b = $a; value (complex):
 ZVAL ty complex data structure:
 string, array, object refcount = 1 Crédito: Nikita Popov
  • 39. ZVAL no PHP 5 zval *$a 1 $a = []; 2 $b = $a; value (complex):
 ZVAL ty complex data structure:
 string, array, object refcount = 2 zval *$b Crédito: Nikita Popov
  • 40. 1 typedef union _zend_value { 2 zend_long lval; 3 double dval; 4 zend_refcounted *counted; 5 zend_string *str; 6 zend_array *arr; 7 zend_object *obj; 8 zend_resource *res; 9 zend_reference *ref; 10 zend_ast_ref *ast; 11 zval *zv; 12 void *ptr; 13 zend_class_entry *ce; 14 zend_function *func; 15 struct { 16 uint32_t w1; 17 uint32_t w2; 18 } ww; 19 } zend_value; 1 struct _zval_struct { 2 zend_value value; 3 union { 4 struct { 5 ZEND_ENDIAN_LOHI_4( 6 zend_uchar type, 7 zend_uchar type_flags, 8 zend_uchar const_flags, 9 zend_uchar reserved) 10 } v; 11 uint32_t type_info; 12 } u1; 13 union { 14 uint32_t var_flags; 15 uint32_t next; 16 uint32_t cache_slot; 17 uint32_t lineno; 18 uint32_t num_args; 19 uint32_t fe_pos; 20 uint32_t fe_iter_idx; 21 uint32_t access_flags; 22 } u2; 23 } zval; ZVAL no PHP 7
  • 41. ZVAL no PHP 7 zval *$a 1 $a = []; 2 $b = $a; value (complex):
 ZVAL ty zval *$b complex data structure:
 string, array, object refcount = 2 Crédito: Nikita Popov
  • 42. ZVAL no PHP 7 zval *$a 1 $a = []; 2 $b = $a; zval *$b complex data structure:
 string, array, object refcount = 2 ZVAL value (complex):
 type_info Crédito: Nikita Popov
  • 43. ZVAL no PHP 7 $a 1 $a = []; 2 $b = $a; $b complex data structure:
 string, array, object refcount = 2 value (complex):
 type_info value (complex):
 type_info Crédito: Nikita Popov
  • 44. PHP 5 vs. PHP 7 ZVAL zval * value (simple):
 null, bool, int, float tyrefcount = 1 1 alocação de memória 1 nível de indireção 40 bytes value (simple):
 null, bool, int, float type_info sem alocações de memória sem indireções 16 bytes
  • 45. PHP 5 vs. PHP 7 ZVAL zval * complex data structure:
 string, array, object value (complex):
 tyrefcount = 1 2 alocações de memória 2 níveis de indireção 40 bytes complex data structure:
 string, array, object refcount = 1 value (complex):
 type_info 1 alocação de memória 1 nível de indireção 24 bytes
  • 46. PHP 5 vs. PHP 7 Objetos zval object store bucket object real tabela de propriedades valor da propriedade zval objeto real + tabela de propriedades
 (incluindo valores) PHP 5 PHP 7 Alocações 2 + 1 / propriedade 1 + 0 / propriedade Tamanho 96 + 40 / propriedade 48 + 16 / propriedade Indireções 4 1
  • 47. PHP.NEXT • Parâmetros nomeados (Named parameters) • Visibilidade de classes (Class Visibility) • Tipagem de propriedades (Typed properties) • Anotações (Annotations) • Coleções (Collections) • Estruturas genéricas (Generics)