Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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 (Scal...
Quebras de compatibilidade
<% /* ... */ %>
<%= /* ... */ %>
<script language="php">/* ... */</script>
<? /* ... */ ?>
<?= ...
Quebras de compatibilidade
• Construtores do PHP 4
1 class Post {
2 public function post() {
3 echo 'post';
4 }
5 }
$post ...
Quebras de compatibilidade
• Mudanças de sintaxe (Uniform variable syntax)
• Novas combinações de operadores
$foo()['bar']...
Quebras de compatibilidade
• Mudanças de sintaxe (Uniform variable syntax)
• Acesso indireto à variáveis, propriedades e m...
Quebras de compatibilidade
• Server APIs removidas:

aolserver, apache,
apache_hooks, apache2filter,
caudium, continuity, i...
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...
Novos operadores
• Operador de comparação combinado (Spaceship operator) (<=>)
1 // Integers
2 echo 1 <=> 1; // 0
3 echo 2...
Novos operadores
• Group use
use EblockDomainDirectoryEntity{
Consigner,
Location as ConsignerLocation,
User
};
use Eblock...
Novos operadores
• Unicode escape syntax (u)
❤ (0x2764)
// <3 no PHP 5
$char = html_entity_decode('&#x10084', 0, 'UTF-8');...
Erros e exceções
• Usuário pode capturar qualquer chamada que possa gerar erros fatais
• A maioria dos error E_RECOVERABLE...
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 '...
Indução de tipo escalar
• Funciona de duas formas distintas:
• Weak mode (Coercivo)
• Strict (Forte)
declare(strict_types=...
Indução de tipo escalar
Tipo declarado int float string bool object
int yes yes* yes† yes no
float yes yes yes† yes no
str...
Indução de tipo escalar
1 declare(strict_types=1);
2
3 function welcome(string $name) {
4 echo 'Welcome to the show, ' . $...
Declaração de tipo de retorno
function getCreator(): UserInterface {
return $this->getPost()->getAuthor();
}
function getA...
Classes anônimas
// Pre PHP 7
class EchoLogger implements LoggerInterface {
public function log($message) {
echo $message;...
Palavras-chave semi-reservadas
• abstract
• and
• array
• as
• break
• callable
• case
• catch
• class*
• clone
• const
• ...
Palavras-chave semi-reservadas
1 namespace HTTP
2 {
3 class StatusCode
4 {
5 const CONTINUE = 100;
6 const SWITCHING_PROTO...
Palavras-chave semi-reservadas
1 $queryBuilder = $repository->createQueryBuilder('e');
2
3 $queryBuilder
4 ->where()
5 ->a...
Mudanças internas
• Árvore de sintaxe abstrata (Abstract Syntax Tree)
• Suporte completo a 64 bits
• Large File Support (L...
Árvore de sintaxe abstrata
<?php
$a = 42;
$b = 24;
echo $a + $b;
<?php T_OPEN_TAG

$a T_VARIABLE

= T_EQUALS

42 T_LNUMBER...
Árvore de sintaxe abstrata
<?php
$a = 42;
$b = 24;
echo $a + $b;
<?php T_OPEN_TAG

$a T_VARIABLE

= T_EQUALS

42 T_LNUMBER...
Otimização de estruturas de dados
• ~20% do tempo gasto no PHP 5 era referente à alocação de memória
• No PHP 7, foi reduz...
Otimização de estruturas de dados
• ZVAL no PHP 5
1 typedef union _zvalue_value {
2 long lval;
3 double dval;
4 struct {
5...
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...
ZVAL no PHP 5
zval *$a
1 $a = [];
2 $b = $a;
value (complex):

ZVAL
ty
complex data structure:

string, array, object
refc...
ZVAL no PHP 5
zval *$a
1 $a = [];
2 $b = $a;
value (complex):

ZVAL
ty
complex data structure:

string, array, object
refc...
1 typedef union _zend_value {
2 zend_long lval;
3 double dval;
4 zend_refcounted *counted;
5 zend_string *str;
6 zend_arra...
ZVAL no PHP 7
zval *$a
1 $a = [];
2 $b = $a;
value (complex):

ZVAL
ty
zval *$b
complex data structure:

string, array, ob...
ZVAL no PHP 7
zval *$a
1 $a = [];
2 $b = $a;
zval *$b
complex data structure:

string, array, object
refcount = 2
ZVAL
val...
ZVAL no PHP 7
$a
1 $a = [];
2 $b = $a;
$b
complex data structure:

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

ty...
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ç...
PHP 5 vs. PHP 7 ZVAL
zval *
complex data structure:

string, array, object
value (complex):

tyrefcount = 1
2 alocações de...
PHP 5 vs. PHP 7 Objetos
zval
object store bucket
object real
tabela de propriedades
valor da propriedade
zval
objeto real
...
PHP.NEXT
• Parâmetros nomeados (Named parameters)
• Visibilidade de classes (Class Visibility)
• Tipagem de propriedades (...
Perguntas?
Thanks! =)
http://github.com/guilhermeblanco
@guilhermeblanco
PHP 7
Upcoming SlideShare
Loading in …5
×

PHP 7

Talk presented at PHP Experience 2016 on March 22, 2016

PHP 7

  1. 1. PHP 7 Guilherme Blanco
  2. 2. Guilherme Blanco http://github.com/guilhermeblanco @guilhermeblanco
  3. 3. Guilherme Blanco http://github.com/guilhermeblanco @guilhermeblanco
  4. 4. http://hhvm.com/blog/9293/lockdown-results-and-hhvm-performance
  5. 5. Agenda • Mudanças para o usuário • Mudanças internas • PHP.NEXT
  6. 6. 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
  7. 7. Quebras de compatibilidade <% /* ... */ %> <%= /* ... */ %> <script language="php">/* ... */</script> <? /* ... */ ?> <?= /* ... */ ?> <?php /* ... */ ?> • Tags alternativas do PHP
  8. 8. 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 }
  9. 9. 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 () {})()
  10. 10. 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']()
  11. 11. 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
  12. 12. Novos operadores • Null coalesce operator (??) • Spaceship operator (<=>) • Group use • Unicode escape syntax (u)
  13. 13. 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;
  14. 14. 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
  15. 15. Novos operadores • Group use use EblockDomainDirectoryEntity{ Consigner, Location as ConsignerLocation, User }; use EblockDomainDirectory{ DTO{ ConsignerUpdate as UpdateConsigner }, Entity{ Consigner, Location, User } };
  16. 16. 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";
  17. 17. 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"
  18. 18. Erros e exceções
  19. 19. 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
  20. 20. Indução de tipo escalar • Funciona de duas formas distintas: • Weak mode (Coercivo) • Strict (Forte) declare(strict_types=1);
  21. 21. 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) { /* ... */ }
  22. 22. 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
  23. 23. 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
  24. 24. 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; } });
  25. 25. 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
  26. 26. Palavras-chave semi-reservadas 1 namespace HTTP 2 { 3 class StatusCode 4 { 5 const CONTINUE = 100; 6 const SWITCHING_PROTOCOLS = 101; 7 // ... 8 } 9 }
  27. 27. 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 ;
  28. 28. 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
  29. 29. Á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
  30. 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 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
  31. 31. 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
  32. 32. 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;
  33. 33. ZVAL no PHP 5 value
 ZVAL ty Crédito: Nikita Popov
  34. 34. ZVAL no PHP 5 value (simple):
 null, bool, int, float ZVAL ty Crédito: Nikita Popov
  35. 35. ZVAL no PHP 5 value (complex):
 ZVAL ty complex data structure:
 string, array, object Crédito: Nikita Popov
  36. 36. ZVAL no PHP 5 1 $a = []; zval *$a value (complex):
 ZVAL ty complex data structure:
 string, array, object refcount = 1 Crédito: Nikita Popov
  37. 37. 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
  38. 38. 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
  39. 39. 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
  40. 40. 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
  41. 41. 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
  42. 42. 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
  43. 43. 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
  44. 44. 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
  45. 45. 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
  46. 46. 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)
  47. 47. Perguntas?
  48. 48. Thanks! =) http://github.com/guilhermeblanco @guilhermeblanco

    Be the first to comment

    Login to see the comments

  • diovanemonteiro

    Mar. 23, 2016
  • LuanKosaka

    Mar. 24, 2016
  • sergiorsiqueira

    Mar. 24, 2016
  • fernandouhu

    Mar. 25, 2016
  • silvaiv

    Mar. 25, 2016
  • otaviocx

    Mar. 25, 2016
  • hussan1

    Mar. 28, 2016
  • tonicospinelli

    Apr. 4, 2016
  • LucianoCamilo1

    Apr. 6, 2017
  • BettyHsieh1

    Apr. 25, 2017
  • adelinopds

    Nov. 29, 2017

Talk presented at PHP Experience 2016 on March 22, 2016

Views

Total views

2,276

On Slideshare

0

From embeds

0

Number of embeds

9

Actions

Downloads

62

Shares

0

Comments

0

Likes

11

×