Upgrade to Pro — share decks privately, control downloads, hide ads and more …

O Que Há de Novo no PHP 7.4?

O Que Há de Novo no PHP 7.4?

O PHP tem evoluído constantemente nos últimos anos e hoje em dia conta com um robusto ecossistema de ferramentas e funcionalidades. E, em breve, será lançado o PHP 7.4. Ela será uma das releases com o maior número de funcionalidades. Nesta apresentação falaremos sobre typed properties, arrow functions, spread operators em arrays, operador de atribuição null coalescing, FFI, preloading, numeric literal separator entre outras funcionalidades. Assista esta palestra e fique por dentro de todas as novidades.

Marcel dos Santos

September 27, 2019
Tweet

More Decks by Marcel dos Santos

Other Decks in Programming

Transcript

  1. Marcel Gonçalves dos Santos
    @marcelgsantos
    php 7.4
    o que há de novo
    no ?

    View Slide

  2. pensandonaweb.com.br
    desenvolvedor web full-stack
    Marcel Gonçalves dos Santos
    @marcelgsantos

    View Slide

  3. View Slide

  4. @femugsp
    sp.femug.com

    View Slide

  5. @phpsp
    phpsp.org.br

    View Slide

  6. Interaja nas mídias sociais!


    - fale sobre o evento, palestrantes e conteúdo
    - tire fotos do evento e publique

    - interaja com outros participantes do evento
    - tire dúvidas ou dê feedbacks para os palestrantes

    View Slide

  7. 1. seguir @marcelgsantos no Twitter

    2. tuitar utilizando as hashtags #php74,

    #locawebphpsummit e #novatec

    3. não vale tuíte em branco e retuíte

    4. ler e preencher este simples formulário

    bit.ly/sorteio-phpcs-2019
    Concorra a um workshop e um livro Novatec!

    View Slide

  8. O início!

    View Slide

  9. o PHP existe há mais de 20 anos e passou
    por várias "revoluções"

    View Slide

  10. na versão 5.3 o PHP incluiu o suporte para
    namespaces, funções lambda e closures

    View Slide

  11. a criação do PHP-FIG permitiu a definição de
    padrões pela comunidade

    View Slide

  12. o Composer causou uma transformação na
    forma como bibliotecas são distribuídas e
    como aplicações PHP são desenvolvidas

    View Slide

  13. na versão 7.0 ficou de 2 a 3 vezes mais
    rápido e inúmeras funcionalidades foram
    adicionadas ao core da linguagem

    View Slide

  14. o PHP como plataforma encontra-se
    mais maduro e robusto

    View Slide

  15. mas sempre existe espaço para melhorar!

    View Slide

  16. a próxima grande novidade do PHP é o
    lançamento da versão 7.4, o maior release 

    desde a versão 7.0

    View Slide

  17. Typed properties ou
    propriedades tipadas

    View Slide

  18. as typed properties ou propriedades
    tipadas é uma das funcionalidades mais
    esperadas do PHP 7.4

    View Slide

  19. o PHP teve uma enorme evolução no seu
    sistema de tipos com o passar do tempo

    View Slide

  20. utilizavam-se docblocks e métodos getters e
    setters para a garantia de tipos

    View Slide

  21. isso fazia com que, para ter essa garantia,
    houvesse um boilerplate desnecessário de
    código

    View Slide

  22. !// code with unnecessary boilerplate to enforce type contracts
    class User {
    /** @var int $id !*/
    private $id;
    /** @var string $name !*/
    private $name;
    public function !__construct(int $id, string $name) {
    $this!->id = $id;
    $this!->name = $name;
    }
    public function getId(): int {
    return $this!->id;
    }
    !// setId, getName and setName implementation!!...
    }

    View Slide

  23. !// more concise code with same type contracts
    class User {
    public int $id;
    public string $name;
    public function !__construct(int $id, string $name) {
    $this!->id = $id;
    $this!->name = $name;
    }
    }

    View Slide

  24. as propriedades tipadas permitem a
    garantia de tipos em tempo de execução

    View Slide

  25. !// properties typed with scalar, class and nullable class
    class User {
    public int $age;
    protected Address $address;
    private ?Passport $passport;
    }

    View Slide

  26. !// types in static property and with var notation
    class Example {
    public static iterable $staticProp;
    var bool $flag;
    }

    View Slide

  27. !// typed properties with default values
    class Example {
    public string $str = "foo";
    public ?string $nullableStr = null;
    }

    View Slide

  28. !// typed properties in one declaration
    class Point {
    public float $x, $y;
    !// more implementation…
    }

    View Slide

  29. !// typed properties in one declaration
    class Point {
    public float $x;
    public float $y;


    !// more implementation…
    }

    View Slide

  30. as declarações de tipos para propriedades
    suportam todos os tipos suportados pelo
    PHP com exceção de void e callable

    View Slide

  31. a tipagem de propriedades, assim como a
    declaração de parâmetros e tipos de retorno,
    são afetadas pela diretiva strict_types

    View Slide

  32. somente a presença de strict_types no local
    de escrita da propriedade é relevante

    View Slide

  33. !// typed properties and strict types
    !// file1.php
    declare(strict_types=1);
    class Test {
    public int $val;
    }
    $test = new Test;
    $test!->val = "42"; !// Throws TypeError

    View Slide

  34. !// typed properties and strict types
    !// file2.php
    declare(strict_types=0);
    $test = new Test;
    $test!->val = "42";
    var_dump($test!->val); !// int(42)

    View Slide

  35. se uma propriedade tipada não tiver
    um valor padrão ela será considerada não
    inicializada

    View Slide

  36. !// uninitialized properties and 

    !// default null (until PHP 7.3)
    class User {
    public $id;
    public $name;
    }
    $user = new User;
    var_dump($user);

    View Slide

  37. class User#1 (2) {
    public $id !=> NULL
    public $name !=> NULL
    }

    View Slide

  38. !// uninitialized properties and 

    !// no null default (PHP 7.4)
    class User {
    public int $id;
    public ?string $name;
    }
    $user = new User;
    var_dump($user);

    View Slide

  39. object(User)#1 (0) {
    ["id"]!=>uninitialized(int)
    ["name"]!=>uninitialized(?string)
    }

    View Slide

  40. ao tentar fazer a leitura de uma propriedade
    não inicializada será lançado um erro do tipo
    TypeError

    View Slide

  41. !// try to access a uninitialized property
    class User {
    public int $id;
    public string $name;
    }
    $user = new User;
    echo $user!->id;
    !// Uncaught Error: Typed property User!::$id must 

    !// not be accessed before initialization

    View Slide

  42. as propriedades tipadas podem ser
    referenciadas

    View Slide

  43. Arrow functions

    View Slide

  44. as funções anônimas no PHP são bastante
    verbosas, principalmente quando vamos
    realizar uma operação simples

    View Slide

  45. isso ocorre por causa do boilerplate sintático 

    e a necessidade de importar as variáveis que
    serão utilizadas no escopo interno da função

    View Slide

  46. !// anonymous function (more verbose)
    $add = function ($x, $y) {
    return $x + $y;
    };

    View Slide

  47. a funcionalidade de arrow functions do
    PHP 7.4 torna mais concisa a sintaxe para
    esse padrão

    View Slide

  48. !// anonymous function (less verbose)
    $add = fn ($x, $y) !=> $x + $y;

    View Slide

  49. a sintaxe de uma arrow function é a
    seguinte: fn(parameter_list) => expression

    View Slide

  50. ao utilizar uma variável definida no escopo
    externo ela será passada de forma
    implícita para a expressão

    View Slide

  51. !// variable in parent scope is captured-by-value

    $y = 1;
    $fn1 = fn($x) !=> $x + $y;
    $fn2 = function ($x) use ($y) {
    return $x + $y;
    };

    View Slide

  52. esse comportamento funciona para

    funções aninhadas

    View Slide

  53. !// variable in parent scope is captured-by-value 

    !// (nested functions)

    $z = 1;
    $fn = fn($x) !=> fn($y) !=> $x * $y + $z;

    View Slide

  54. as arrow functions permitem diversas
    assinaturas de funções…

    View Slide

  55. …incluindo tipos de parâmetros e retornos,
    valores padrão, variadics e passagem e
    retorno de valor por referência

    View Slide

  56. !// different function signatures
    fn(array $x) !=> $x;
    fn(): int !=> $x;
    fn($x = 42) !=> $x;
    fn(&$x) !=> $x;
    fn&($x) !=> $x;
    fn($x, !!...$rest) !=> $rest;

    View Slide

  57. as arrow function podem ser utilizadas
    inúmeros casos do dia-a-dia

    View Slide

  58. !// arrow functions help reducing code boilerplate

    !// (without arrow functions)
    $result = Collection!::from([1, 2])
    !->map(function ($v) {
    return $v * 2;
    })
    !->reduce(function ($tmp, $v) {
    return $tmp + $v;
    }, 0);
    echo $result; !// 6

    View Slide

  59. !// arrow functions help reducing code boilerplate
    !// (with arrow functions)

    $result = Collection!::from([1, 2])
    !->map(fn($v) !=> $v * 2)
    !->reduce(fn($tmp, $v) !=> $tmp + $v, 0);
    echo $result; !// 6

    View Slide

  60. Spread operator
    em arrays

    View Slide

  61. o PHP possui o suporte ao argument
    unpacking desde a versão 5.6 da linguagem

    View Slide

  62. a funcionalidade permite o "desempacota-
    mento" de um array (ou um Traversable) em
    uma lista de argumentos utilizando o spread
    operator

    View Slide

  63. function sum($a, $b) {
    return $a + $b;
    }
    !// using spread operator (!!...) to unpacking
    !// an array as an argument list
    $numbers = [3, 5];
    echo sum(!!...$numbers); !// 8

    View Slide

  64. a utilização do spread operator não era
    permitido na definição de arrays a partir de
    outro array

    View Slide

  65. !// using spread operator to define a new array
    !// from another is not supported
    $someNumbers = [2, 3, 4];
    $numbers = [1, !!...$someNumbers, 5];
    print_r($numbers);

    !// PHP Parse error: syntax error, unexpected '!!...'

    !// (T_ELLIPSIS), expecting ']'

    View Slide

  66. a nova funcionalidade permite a utilização
    do spread operator (...) na definição de um
    array através do unpacking dos valores de
    outro array ou Traversable

    View Slide

  67. !// using spread operator to define an array from another
    $someNames = ['Bob', 'Carol'];
    $names = ['Alice', !!...$someNames, 'Daniel', 'Elisa'];
    print_r($names);
    !// ['Alice', 'Bob', 'Carol', 'Daniel', 'Elisa'];

    View Slide

  68. essa funcionalidade só está disponível para
    arrays com chaves numéricas (para manter
    consistência com o argument unpacking)

    View Slide

  69. é possível realizar a expansão de arrays
    múltiplas vezes e pode-se desempacotar
    um array retornado por uma função

    View Slide

  70. Operador de atribuição 

    null coalescing

    View Slide

  71. sempre que precisávamos verificar se
    uma variável foi definida e é não-nula,
    utilizávamos o operador ternário (?:) junto
    com a função isset

    View Slide

  72. !// check if a variable is defined and not null


    !// $data['name'] = 'John';
    $name = isset($data['name']) ? $data['name'] : 'anonymous';
    echo $name; !// anonymous

    View Slide

  73. !// check if a variable is defined and not null


    $data['name'] = 'John';
    $name = isset($data['name']) ? $data['name'] : 'anonymous';
    echo $name; !// John

    View Slide

  74. a utilização do operador null coalesce (??),
    disponível a partir do PHP 7.0, torna mais
    fácil lidar com esse problema

    View Slide

  75. !// using null coalesce !?? operator
    !// $data['name'] = 'John';
    $name = $data['name'] !?? 'anonymous';
    echo $name; !// anonymous

    View Slide

  76. !// using null coalesce !?? operator
    $data['name'] = 'John';
    $name = $data['name'] !?? 'anonymous';
    echo $name; !// John

    View Slide

  77. o código fica mais claro e legível

    View Slide

  78. em casos que desejamos verificar se uma
    variável foi definida e é não-nula e atribuir o
    valor a ela própria ou usar um valor padrão o
    código fica pouco legível

    View Slide

  79. !// check if variable is defined and not null and assign itself

    !// (without using null coalesce assignment operator)

    $data['comments']['name'] = $data['comments']['name'] !?? 'anonymous';

    View Slide

  80. no PHP 7.4 é possível utilizar o operador de
    atribuição null coalesce (??=) que permite
    alcançar o mesmo objetivo de uma forma
    mais expressiva

    View Slide

  81. !// check if variable is defined and not null and assign itself

    !// (using null coalesce assignment operator)
    $data['comments']['name'] !??= 'anonymous';

    View Slide

  82. Numeric literal

    separator

    View Slide

  83. ei, você consegue identificar que número é
    esse?

    View Slide

  84. 1000000000;

    View Slide

  85. é um bilhão, 100 milhões ou 10 bilhões?

    View Slide

  86. Difícil, né?!

    View Slide

  87. o olho de um ser humano não é otimizado
    para olhar e decodificar rapidamente uma
    sequências de dígitos

    View Slide

  88. e esse valor?

    View Slide

  89. $discount = 13500;

    View Slide

  90. é 13.500 ou 135 porque está em centavos?

    View Slide

  91. a nova funcionalidade numeric literal
    separator permite usar um separador visual
    para ajudar a melhorar a legibilidade do
    código e transmitir informações adicionais

    View Slide

  92. !// using numeric literal separator
    $threshold = 1_000_000_000; !// a billion
    $testValue = 10_925_284.88; !// scale is hundreds of millions
    $discount = 135_00; !// $135, stored as cents

    View Slide

  93. adicionar o underscore entre dois dígitos
    não alterará o seu valor

    View Slide

  94. !// adding undescore doesn't change the value
    var_dump(1_000_000); !// int(1000000)

    View Slide

  95. FFI ou foreign

    function interface

    View Slide

  96. a nova funcionalidade FFI ou foreign
    function interface é outra das mais
    esperadas para o PHP 7.4

    View Slide

  97. ela permite que um código PHP execute um
    código escrito em outra linguagem (C, por
    exemplo) ou fazer algo que não é suportado

    View Slide

  98. !// calls abs() function from libc.so using PHP
    $ffi = FFI!::cdef('int abs(int j);', 'libc.so.6');
    var_dump($ffi!->abs(-42)); !// 42

    View Slide

  99. assistam a palestra de encerramento do
    Gabriel Couto sobre FFI que ele preparou
    coisas fantásticas para mostrar para vocês!

    View Slide

  100. Preloading

    View Slide

  101. o preloading é outra funcionalidade muito
    esperada do PHP 7.4

    View Slide

  102. para realizar o preload de arquivos deve-se
    escrever um script para isso

    View Slide

  103. o script é executado somente uma vez no
    início do servidor

    View Slide

  104. todos os arquivos pré-carregados estão
    disponíveis em memória para as requisições
    posteriores

    View Slide

  105. depois de qualquer alteração nos arquivos
    pré-carregados deve-se reiniciar o servidor

    View Slide

  106. Quando vou 

    poder utilizar?

    View Slide

  107. o PHP 7.4 estará disponível a partir de
    novembro de 2019

    View Slide

  108. porém, as versões RC ou release candidates
    podem ser utilizadas agora para testes

    View Slide

  109. Como faço para

    utilizá-lo neste momento?

    View Slide

  110. o PHP 7.4 pode ser utilizado de duas formas
    principais: compilando o código
    fonte ou utilizando uma imagem Docker

    View Slide

  111. o processo de compilar o código fonte do
    PHP, apesar de ser um trabalho tedioso,
    é super importante para a criação de
    instalações específicas

    View Slide

  112. contudo, para o nosso caso (e muitos outros),
    é mais prático a utilização de uma imagem
    Docker

    View Slide

  113. View Slide

  114. $ docker image pull php:7.4.0RC1-cli-alpine3.10

    View Slide

  115. $ alias php74='docker container run -it !--rm -v 

    “$PWD":/app -w /app php:7.4.0RC1-cli-alpine3.10 php'

    View Slide

  116. $ php74 !--version

    PHP 7.4.0RC1 (cli) (built: Sep 18 2019 21:37:20) ( NTS )
    Copyright (c) The PHP Group
    Zend Engine v3.4.0-dev, Copyright (c) Zend Technologies

    View Slide

  117. dependendo do editor que você utilizar,
    você pode ter problemas com o syntax
    highlight e o aviso de erros do editor

    View Slide

  118. o PhpStorm 2019.3 EAP já possui suporte
    para as funcionalidades do PHP 7.4

    View Slide

  119. View Slide

  120. Qual é o 

    futuro do PHP?

    View Slide

  121. a próxima versão após o PHP 7.4 será a
    versão 8.0 e será lançada em novembro de
    2020

    View Slide

  122. a funcionalidade mais esperada para o PHP
    8.0 é o JIT ou Just-In-Time Compiler

    View Slide

  123. a compilação just-in-time permite a
    compilação de um programa em tempo de
    execução

    View Slide

  124. a RFC do JIT foi aceita no início de 2019 e
    entraria como uma funcionalidade
    experimental no PHP 7.4

    View Slide

  125. porém, isso foi recusado pelo internals

    View Slide

  126. outra funcionalidade que ficou em evidência
    para o PHP 8.0 são as union types

    View Slide

  127. uma union type aceita valores de tipos
    diferentes ao invés de apenas um tipo

    View Slide

  128. as union types não são suportadas pelo PHP
    mas é possível utilizá-las via annotations em
    docblocks

    View Slide

  129. Conclusão

    View Slide

  130. o PHP tem tido uma enorme evolução e tem
    se tornado uma linguagem mais robusta

    View Slide

  131. porém, sem perder a flexibilidade e a
    pequena curva de aprendizado que o torna
    uma linguagem tão democrática

    View Slide

  132. as novas funcionalidades ajudarão o seu
    código a ter mais garantias, ser mais
    expressivo e te dar mais poderes

    View Slide

  133. vá em frente e divirta-se!

    View Slide

  134. Referências

    View Slide

  135. bit.ly/referencias-palestra-php74

    View Slide

  136. Avalie!

    View Slide

  137. joind.in/talk/cd7b9

    View Slide

  138. Anúncio!

    View Slide

  139. bit.ly/workshop-php74
    cupom de 20% desconto: MARCEL

    View Slide

  140. @marcelgsantos
    speakerdeck.com/marcelgsantos
    Obrigado.
    Perguntas?

    View Slide