Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

@femugsp sp.femug.com

Slide 5

Slide 5 text

@phpsp phpsp.org.br

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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!

Slide 8

Slide 8 text

O início!

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

o PHP como plataforma encontra-se mais maduro e robusto

Slide 15

Slide 15 text

mas sempre existe espaço para melhorar!

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

Typed properties ou propriedades tipadas

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

!// 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!!... }

Slide 23

Slide 23 text

!// 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; } }

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

!// 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

Slide 42

Slide 42 text

as propriedades tipadas podem ser referenciadas

Slide 43

Slide 43 text

Arrow functions

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

!// variable in parent scope is captured-by-value
 $y = 1; $fn1 = fn($x) !=> $x + $y; $fn2 = function ($x) use ($y) { return $x + $y; };

Slide 52

Slide 52 text

esse comportamento funciona para
 funções aninhadas

Slide 53

Slide 53 text

!// variable in parent scope is captured-by-value 
 !// (nested functions)
 $z = 1; $fn = fn($x) !=> fn($y) !=> $x * $y + $z;

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

!// 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

Slide 59

Slide 59 text

!// 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

Slide 60

Slide 60 text

Spread operator em arrays

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

!// 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 ']'

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

!// 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'];

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

Operador de atribuição 
 null coalescing

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

!// check if a variable is defined and not null
 
 !// $data['name'] = 'John'; $name = isset($data['name']) ? $data['name'] : 'anonymous'; echo $name; !// anonymous

Slide 73

Slide 73 text

!// check if a variable is defined and not null
 
 $data['name'] = 'John'; $name = isset($data['name']) ? $data['name'] : 'anonymous'; echo $name; !// John

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

o código fica mais claro e legível

Slide 78

Slide 78 text

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

Slide 79

Slide 79 text

!// check if variable is defined and not null and assign itself
 !// (without using null coalesce assignment operator)
 $data['comments']['name'] = $data['comments']['name'] !?? 'anonymous';

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

!// check if variable is defined and not null and assign itself
 !// (using null coalesce assignment operator) $data['comments']['name'] !??= 'anonymous';

Slide 82

Slide 82 text

Numeric literal
 separator

Slide 83

Slide 83 text

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

Slide 84

Slide 84 text

1000000000;

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

Difícil, né?!

Slide 87

Slide 87 text

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

Slide 88

Slide 88 text

e esse valor?

Slide 89

Slide 89 text

$discount = 13500;

Slide 90

Slide 90 text

é 13.500 ou 135 porque está em centavos?

Slide 91

Slide 91 text

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

Slide 92

Slide 92 text

!// 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

Slide 93

Slide 93 text

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

Slide 94

Slide 94 text

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

Slide 95

Slide 95 text

FFI ou foreign
 function interface

Slide 96

Slide 96 text

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

Slide 97

Slide 97 text

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

Slide 98

Slide 98 text

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

Slide 99

Slide 99 text

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

Slide 100

Slide 100 text

Preloading

Slide 101

Slide 101 text

o preloading é outra funcionalidade muito esperada do PHP 7.4

Slide 102

Slide 102 text

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

Slide 103

Slide 103 text

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

Slide 104

Slide 104 text

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

Slide 105

Slide 105 text

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

Slide 106

Slide 106 text

Quando vou 
 poder utilizar?

Slide 107

Slide 107 text

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

Slide 108

Slide 108 text

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

Slide 109

Slide 109 text

Como faço para
 utilizá-lo neste momento?

Slide 110

Slide 110 text

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

Slide 111

Slide 111 text

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

Slide 112

Slide 112 text

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

Slide 113

Slide 113 text

No content

Slide 114

Slide 114 text

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

Slide 115

Slide 115 text

$ alias php74='docker container run -it !--rm -v 
 “$PWD":/app -w /app php:7.4.0RC1-cli-alpine3.10 php'

Slide 116

Slide 116 text

$ 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

Slide 117

Slide 117 text

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

Slide 118

Slide 118 text

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

Slide 119

Slide 119 text

No content

Slide 120

Slide 120 text

Qual é o 
 futuro do PHP?

Slide 121

Slide 121 text

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

Slide 122

Slide 122 text

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

Slide 123

Slide 123 text

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

Slide 124

Slide 124 text

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

Slide 125

Slide 125 text

porém, isso foi recusado pelo internals

Slide 126

Slide 126 text

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

Slide 127

Slide 127 text

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

Slide 128

Slide 128 text

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

Slide 129

Slide 129 text

Conclusão

Slide 130

Slide 130 text

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

Slide 131

Slide 131 text

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

Slide 132

Slide 132 text

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

Slide 133

Slide 133 text

vá em frente e divirta-se!

Slide 134

Slide 134 text

Referências

Slide 135

Slide 135 text

bit.ly/referencias-palestra-php74

Slide 136

Slide 136 text

Avalie!

Slide 137

Slide 137 text

joind.in/talk/cd7b9

Slide 138

Slide 138 text

Anúncio!

Slide 139

Slide 139 text

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

Slide 140

Slide 140 text

@marcelgsantos speakerdeck.com/marcelgsantos Obrigado. Perguntas?