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