PHP 7.3 AND ITS RFC
PHP 7.3 beta 1
PHP Québec - 2018 - Montréal, QC, Canada
AGENDA
• PHP 7.3
• Nouveautés, incompatibilités
• Comment migrer
• les RFC
SPEAKER
• Damien Seguy
• Exakat CTO
• Analyse statique
pour PHP
PROGRAMME
• 1er aout 2018 : Feature freeze
• 2 aout 2018 : beta 1
• 13 septembre 2018 : RC1
• 13 décembre 2018 : 7.3.0
EVOLUTIONS MAJEURES
GARBAGE COLLECTOR AMÉLIORÉ
// Very, very, very many objects
GC | OLD | NEW
disabled | 1.32s | 1.50s
enabled | 12.75s | 2.32s
// Very many objects
GC | OLD | NEW
disabled | 0.87s | 0.87s
enabled | 1.48s | 0.94s
// Less many objects
GC | OLD | NEW
disabled | 1.65s | 1.62s
enabled | 1.75s | 1.62s
• 10% de pertes si
désactivé
• Si peu d'objects, peu
de gains
• Si beaucoup d'objets,
beaucoup de gain
• La plupart des scripts
n'utilisent pas le GC
RELAXED HEREDOC/NOWDOC
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
} <?php
function foo($arg) {
$bar = <<<'EOT'
bar$arg
EOT;
}
RELAXED HEREDOC/NOWDOC
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
"bar"
• Tabulations or spaces
• Don't mix them!
RELAXED HEREDOC/NOWDOC
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
" bar"
• Trailing comma
• Comme pour les tableaux
• Le dernier élément peut être vide
• Seulement applicable au dernier element
• Valable pour les méthodes et les fonctions
• Pratique pour éviter les diff trop longs
VIRGULE TERMINALE
foo(
$foo,
$bar,
$baz,
);
PLUS DE CONSTANTES
INSENSIBLES À LA CASSE
namespace {
define('NSFOO', 42, true); 

// constante insensible à la casse
}
 
namespace Test {
use const NSFOO;
var_dump(FOO); // OK
var_dump(foo); // Warning
}
PLUS DE CONSTANTES
INSENSIBLES À LA CASSE
• Les conventions sont de faire des constantes en
majuscules et de les utiliser en majuscule
• Les constantes sont de plus en plus définies avec
const, et non plus avec define()
• null, true, false seront des mots réservés en PHP 8
• Il reste les fonctions insensibles à la casse
INFRASTRUCTURE
NOUVEAU SQLITE3
• Version 3.24
• Ajout du support de UPSERT
• UPSERT = INSERT or UPDATE
• An UPSERT is an ordinary INSERT statement that is
followed by the special ON CONFLICT clause
shown above.
• REPLACE = INSERT or OVERWRITE
NEW PCRE VERSION : 2.0!
• PHP 7.2 utilise PCRE1
• PHP 7.3 utilise PCRE2
• Beaucoup de nouveautés, peu d'incompatibilité
• les options X et S disparaissent
• Plus de vérifications à la compilation
EVOLUTIONS MINEURES
JSON_ENCODE ÉMET DES
EXCEPTIONS
• json_encode/json_decode peuvent retourner
NULL , false, chaîne vide
• Comment faire la différence entre une erreur et un
encodage correct ?
• nouvelle option : JSON_THROW_ON_ERROR, à
utiliser avec un try{} catch
• A suivre…
COMPACT SIGNALE LES
VARIABLES NON DÉFINIES
$foo = 'bar';
 
$baz = compact('foo', 'foz'); // Notice:
compact(): Undefined variable: foz
NET_GET_INTERFACES()
• Liste les
interfaces
réseaux
disponibles.
• Permet de lire
les
informations
système.
Array
(
[lo0] => Array
(
[unicast] => Array
(
[0] => Array
(
[flags] => 32841
[family] => 18
)
[1] => Array
(
[flags] => 32841
[family] => 30
[address] => ::1
[netmask] => ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
)
[2] => Array
(
[flags] => 32841
[family] => 2
[address] => 127.0.0.1
[netmask] => 255.0.0.0
)
[3] => Array
(
[flags] => 32841
[family] => 30
[address] => fe80::1
[netmask] => ffff:ffff:ffff:ffff::
)
)
)
[gif0] => Array
IS_COUNTABLE
• is_countable() vérifie qu'une variable peut être
comptée avec count()
• un array() ou un objet avec l'interface Countable
SAME SITE COOKIE
• setcookie
• setrawcookie
• session_set_cookie_params
• session_get_cookie_params
void session_set_cookie_params ( int $lifetime 

[, array $options ] )
Set-Cookie: key=value; path=/; domain=example.org;
HttpOnly; SameSite=Lax
LIST() WITH REFERENCE
$array = [1, 2];
list($a, &$b) = $array;
$array = [1, 2];
$a = $array[0];
$b =& $array[1];
LIST() WITH REFERENCE
$array = [[1, 2], [3, 4]];
foreach ($array as list(&$a, $b)) {
$a = 7;
}
var_dump($array)
REMOVED FEATURES
• image2wbmp
• imagefromstring() support webp désormais
• alias mbstring() qui ne sont pas documentés
• Définition d'une fonction assert()
• Recherche dans une chaîne avec des entiers
PREMIÈRE CLÉ D'UN TABLEAU
// usage of an associative array
$array = ['a' => 1, 'b' => 2, 'c' => 3];
PREMIÈRE CLÉ D'UN TABLEAU
// usage of an associative array
$array = ['a' => 1, 'b' => 2, 'c' => 3];
 
$firstKey = array_keys($array)[0];
$lastKey = array_keys($array)[count($array) - 1];
ARRAY_KEY_LAST,
ARRAY_KEY_FIRST
// usage of an associative array
$array = ['a' => 1, 'b' => 2, 'c' => 3];
 
$firstKey = array_key_first($array);
$lastKey = array_key_last($array);
 
assert($firstKey === 'a');
assert($lastKey === 'c');
DIVERS
• Retrait du support de BeOS
• FILTER_SANITIZE_ADD_SLASHES
RFC
RFC : COMMENT CA MARCHE
RFC : COMMENT CA MARCHE
• Under Discussion
• In draft
• Pending Implementation
• For PHP 8.0
• PHP 7.3
• PHP 7.2…
RFC : COMMENT CA MARCHE
• Under Discussion
• In draft
• Pending Implementation
• For PHP 8.0
• PHP 7.3
• PHP 7.2…
MERCI!
@EXAKAT - HTTP://WWW.EXAKAT.IO/

Tout sur PHP 7.3 et ses RFC

  • 1.
    PHP 7.3 ANDITS RFC PHP 7.3 beta 1 PHP Québec - 2018 - Montréal, QC, Canada
  • 2.
    AGENDA • PHP 7.3 •Nouveautés, incompatibilités • Comment migrer • les RFC
  • 3.
    SPEAKER • Damien Seguy •Exakat CTO • Analyse statique pour PHP
  • 4.
    PROGRAMME • 1er aout2018 : Feature freeze • 2 aout 2018 : beta 1 • 13 septembre 2018 : RC1 • 13 décembre 2018 : 7.3.0
  • 5.
  • 6.
    GARBAGE COLLECTOR AMÉLIORÉ //Very, very, very many objects GC | OLD | NEW disabled | 1.32s | 1.50s enabled | 12.75s | 2.32s // Very many objects GC | OLD | NEW disabled | 0.87s | 0.87s enabled | 1.48s | 0.94s // Less many objects GC | OLD | NEW disabled | 1.65s | 1.62s enabled | 1.75s | 1.62s • 10% de pertes si désactivé • Si peu d'objects, peu de gains • Si beaucoup d'objets, beaucoup de gain • La plupart des scripts n'utilisent pas le GC
  • 7.
    RELAXED HEREDOC/NOWDOC <?php class foo{ public $bar = <<<EOT bar EOT; } <?php function foo($arg) { $bar = <<<'EOT' bar$arg EOT; }
  • 8.
    RELAXED HEREDOC/NOWDOC <?php class foo{ public $bar = <<<EOT bar EOT; } "bar"
  • 9.
    • Tabulations orspaces • Don't mix them! RELAXED HEREDOC/NOWDOC <?php class foo { public $bar = <<<EOT bar EOT; } " bar"
  • 10.
    • Trailing comma •Comme pour les tableaux • Le dernier élément peut être vide • Seulement applicable au dernier element • Valable pour les méthodes et les fonctions • Pratique pour éviter les diff trop longs VIRGULE TERMINALE foo( $foo, $bar, $baz, );
  • 11.
    PLUS DE CONSTANTES INSENSIBLESÀ LA CASSE namespace { define('NSFOO', 42, true); 
 // constante insensible à la casse }   namespace Test { use const NSFOO; var_dump(FOO); // OK var_dump(foo); // Warning }
  • 12.
    PLUS DE CONSTANTES INSENSIBLESÀ LA CASSE • Les conventions sont de faire des constantes en majuscules et de les utiliser en majuscule • Les constantes sont de plus en plus définies avec const, et non plus avec define() • null, true, false seront des mots réservés en PHP 8 • Il reste les fonctions insensibles à la casse
  • 13.
  • 14.
    NOUVEAU SQLITE3 • Version3.24 • Ajout du support de UPSERT • UPSERT = INSERT or UPDATE • An UPSERT is an ordinary INSERT statement that is followed by the special ON CONFLICT clause shown above. • REPLACE = INSERT or OVERWRITE
  • 15.
    NEW PCRE VERSION: 2.0! • PHP 7.2 utilise PCRE1 • PHP 7.3 utilise PCRE2 • Beaucoup de nouveautés, peu d'incompatibilité • les options X et S disparaissent • Plus de vérifications à la compilation
  • 16.
  • 17.
    JSON_ENCODE ÉMET DES EXCEPTIONS •json_encode/json_decode peuvent retourner NULL , false, chaîne vide • Comment faire la différence entre une erreur et un encodage correct ? • nouvelle option : JSON_THROW_ON_ERROR, à utiliser avec un try{} catch • A suivre…
  • 18.
    COMPACT SIGNALE LES VARIABLESNON DÉFINIES $foo = 'bar';   $baz = compact('foo', 'foz'); // Notice: compact(): Undefined variable: foz
  • 19.
    NET_GET_INTERFACES() • Liste les interfaces réseaux disponibles. •Permet de lire les informations système. Array ( [lo0] => Array ( [unicast] => Array ( [0] => Array ( [flags] => 32841 [family] => 18 ) [1] => Array ( [flags] => 32841 [family] => 30 [address] => ::1 [netmask] => ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff ) [2] => Array ( [flags] => 32841 [family] => 2 [address] => 127.0.0.1 [netmask] => 255.0.0.0 ) [3] => Array ( [flags] => 32841 [family] => 30 [address] => fe80::1 [netmask] => ffff:ffff:ffff:ffff:: ) ) ) [gif0] => Array
  • 20.
    IS_COUNTABLE • is_countable() vérifiequ'une variable peut être comptée avec count() • un array() ou un objet avec l'interface Countable
  • 21.
    SAME SITE COOKIE •setcookie • setrawcookie • session_set_cookie_params • session_get_cookie_params void session_set_cookie_params ( int $lifetime 
 [, array $options ] ) Set-Cookie: key=value; path=/; domain=example.org; HttpOnly; SameSite=Lax
  • 22.
    LIST() WITH REFERENCE $array= [1, 2]; list($a, &$b) = $array; $array = [1, 2]; $a = $array[0]; $b =& $array[1];
  • 23.
    LIST() WITH REFERENCE $array= [[1, 2], [3, 4]]; foreach ($array as list(&$a, $b)) { $a = 7; } var_dump($array)
  • 24.
    REMOVED FEATURES • image2wbmp •imagefromstring() support webp désormais • alias mbstring() qui ne sont pas documentés • Définition d'une fonction assert() • Recherche dans une chaîne avec des entiers
  • 25.
    PREMIÈRE CLÉ D'UNTABLEAU // usage of an associative array $array = ['a' => 1, 'b' => 2, 'c' => 3];
  • 26.
    PREMIÈRE CLÉ D'UNTABLEAU // usage of an associative array $array = ['a' => 1, 'b' => 2, 'c' => 3];   $firstKey = array_keys($array)[0]; $lastKey = array_keys($array)[count($array) - 1];
  • 27.
    ARRAY_KEY_LAST, ARRAY_KEY_FIRST // usage ofan associative array $array = ['a' => 1, 'b' => 2, 'c' => 3];   $firstKey = array_key_first($array); $lastKey = array_key_last($array);   assert($firstKey === 'a'); assert($lastKey === 'c');
  • 28.
    DIVERS • Retrait dusupport de BeOS • FILTER_SANITIZE_ADD_SLASHES
  • 30.
  • 31.
    RFC : COMMENTCA MARCHE
  • 32.
    RFC : COMMENTCA MARCHE • Under Discussion • In draft • Pending Implementation • For PHP 8.0 • PHP 7.3 • PHP 7.2…
  • 33.
    RFC : COMMENTCA MARCHE • Under Discussion • In draft • Pending Implementation • For PHP 8.0 • PHP 7.3 • PHP 7.2…
  • 38.