SlideShare ist ein Scribd-Unternehmen logo
1 von 49
Downloaden Sie, um offline zu lesen
PHP 7.4
Nouveautés
Julien Vinber - Meetup AFUP Montpellier
28 janvier 2020 - Crealead
Julien Vinber
Slack Mth : @julienvinber
LinkedIn : @julienvinber
● Lead Dev chez Qape
● Dev PHP/Symfony
● Dev depuis plus de 15 ans
● Coordinateur AFUP Montpellier
Rappel
Modification structurelle.
Typed properties
<?php
class Utilisateur73
{
/**
* @var int
*/
public $id;
/**
* @var string
*/
public $nom;
/**
* @var string|null
*/
public $prenom;
}
<?php
class Utilisateur74
{
public int $id;
public string $nom;
public ?string $prenom;
}
https://wiki.php.net/rfc/typed_properties_v2
Type de retour covariant
interface CollectionInterface
{
public function premier(): ItemInterface;
}
class CollectionUtilisateur implements CollectionInterface
{
public function premier(): Utilisateur
{ }
}
class Item
{
public string $nom;
}
class Utilisateur extends Item
{}
https://wiki.php.net/rfc/covariant-returns-and-contravariant-parameters
Type de paramètre contravariant
interface CollectionInterface
{
public function ajouter(Item $item): void;
}
class CollectionUtilisateur implements CollectionInterface
{
public function ajouter(Utilisateur $utilisateur): void;
{ }
}
class Item
{
public string $nom;
}
class Utilisateur extends Item
{}
https://wiki.php.net/rfc/covariant-returns-and-contravariant-parameters
class CollectionParent
{
public function ajouter(Utilisateur $utilisateur):void
{print($utilisateur);}
}
class CollectionEnfant extends CollectionParent
{
public function ajouter(Item $utilisateur):void
{print($utilisateur);}
}
class Item
{
public string $nom;
}
class Utilisateur extends Item
{}
Nouvelle solution pour sérialiser un objet
https://wiki.php.net/rfc/custom_object_serialization
Serializable
class A implements Serializable {
private $prop;
public function serialize() {
return serialize($this->prop);
}
public function unserialize($payload) {
$this->prop = unserialize($payload);
}
}
class B extends A {
private $prop;
public function serialize() {
return serialize([$this->prop, parent::serialize()])
}
public function unserialize($payload) {
[$prop, $parent] = unserialize($payload);
parent::unserialize($parent);
$this->prop = $prop;
}
}
__sleep / __wakeup
class A implements Serializable {
private $ttc;
private $ht;
public function __sleep() {
return [‘ht’];
}
public function __wakeup() {
$this->ttc = $ht * 1.2;
}
}
Nouvelle solution :
class A {
private $prop_a;
public function __serialize(): array {
return ["prop_a" => $this->prop_a];
}
public function __unserialize(array $data) {
$this->prop_a = $data["prop_a"];
}
}
class B extends A {
private $prop_b;
public function __serialize(): array {
return [
"prop_b" => $this->prop_b,
"parent_data" => parent::__serialize(),
];
}
public function __unserialize(array $data) {
parent::__unserialize($data["parent_data"]);
$this->prop_b = $data["prop_b"];
}
}
Weak References
$object = new stdClass;
$weakRef = WeakReference::create($object);
var_dump($weakRef->get()); //object(stdClass)#1 (0) {}
unset($object);
var_dump($weakRef->get()); //null
https://wiki.php.net/rfc/weakrefs
Les performances
Preloading
lecture
index.php
index.php compilation
index.php
execution
index.php
lecture
lib1.php
compilation
lib1.php
execution
lib1.php
La version simple
...
https://wiki.php.net/rfc/preload
Preloading
lecture
index.php
index.php compilation
index.php
execution
index.php
lecture
lib1.php
compilation
lib1.php
execution
lib1.php
Avec OPCache
...
Preloading
lecture
index.php
index.php compilation
index.php
execution
index.php
lecture
lib1.php
compilation
lib1.php
execution
lib1.php
Avec OPCache : premier fois
...
OPCACHE
index.php
OPCACHE
lib1.php
Preloading
index.php execution
index.php
execution
lib1.php
Avec OPCache : ensuite
...
OPCACHE
index.php
OPCACHE
lib1.php
Preloading
C’est mieux, mais il reste la première fois.
Preloading
Nouveau avec PHP 7.4 le preloading :
; php.ini
opcache.preload=/path/monfichier.php
Preloading
Exemple avec SF5/SF4.4
; php.ini
opcache.preload=/path/to/project/var/cache/prod/App_KernelPro
dContainer.preload.php
/**
* Get files that specified suffix
* @param $path
* @param array $files
* @return array
*/
function getfiles( $path , &$files = array() ) {
if ( !is_dir( $path ) ) return null;
$handle = opendir( $path );
while ( false !== ( $file = readdir( $handle ) ) ) {
if ( $file != '.' && $file != '..' ) {
$path2 = $path . '/' . $file;
if ( is_dir( $path2 ) ) {
getfiles( $path2 , $files );
} else {
if ( preg_match( "/.(php|php5)$/i" , $file ) ) {
$files[] = $path2;
}
}
}
}
return $files;
}
$files = getfiles('/png/www/example.com/public_html/app/wordpress');
$br = (php_sapi_name() == "cli") ? "n" : "<br />";
foreach($files as $file){
opcache_compile_file($file);
echo $file.$br;
}
Preloading
ATTENTION : à réserver pour la prod
MAJ => recharger PHP
En chiffres
https://stitcher.io/blog/php-preload-benchmarks
Un peu de sucre...
...
Existe depuis la 5.6
Permet de “packager” des arguments
function test($arg1, $arg2, $arg3 = null) {
var_dump($arg1, $arg2, $arg3);
}
test(...[1, 2]); // 1, 2
test(...[1, 2, 3]); // 1, 2, 3
test(...[1, 2, 3, 4]); // 1, 2, 3 (remaining arg is not captured by the function declaration)
https://wiki.php.net/rfc/spread_operator_for_array
...
En PHP 7.4
Étendu sur les Array
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
var_dump($fruits);
...
La source peut être un tableau, un Traversable ou générateur.
function generator() {
for ($i = 3; $i <= 5; $i++) {
yield $i;
}
}
$arr1 = [0, 1, 2, ...generator()];
Fonctions anonymes courts
Les fonctions anonymes sont arrivées en 5.3
function array_values_from_keys($arr, $keys) {
return array_map(function ($x) use ($arr) { return $arr[$x]; }, $keys);
}
En 7.4
function array_values_from_keys($arr, $keys) {
return array_map(fn($x) => $arr[$x], $keys);
}
https://wiki.php.net/rfc/arrow_functions_v2
Assignation Coalesce Null
Depuis 7.0
$username = $_GET['user'] ?? 'nobody';
En 7.4
$valeur ??= 'nada';
https://wiki.php.net/rfc/null_coalesce_equal_operator
Séparateur neutre pour les nombres.
$nombre = 1000000000;
$nombre = 1_000_000_000;
Attention : à utiliser uniquement entre 2 chiffres “100_” n’est pas autorisé.
https://wiki.php.net/rfc/numeric_literal_separator
FFI
FFI - Foreign Function Interface
Permet de s’interfacer directement en PHP à des bibliothèques externes (.so, .dll)
Sans extension PHP à écrite dans un Autre langage et à installer spécifiquement sur le serveur.
https://wiki.php.net/rfc/ffi
Comment cela marche?
● On prend une librairie existante ou nous créons notre propre librairie.
● On récupère ou on crée le fichiers .h de cette librairie
● On charge la librairie.
● On peut l’utiliser.
Un exemple volé emprunté chez jolicode
Utilisation de la librairie libuuid
https://jolicode.com/blog/php-7-4-et-ffi-ce-quil-faut-retenir
Le fichier .h origine.
Le fichier .h nétoyer
Utilisation en PHP
<?php
$ffi = FFI::load(__DIR__ . '/include/uuid-php.h');
$output = $ffi->new('uuid_t');
$ffi->uuid_generate_random($output);
$uuid = sprintf('%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x', ...$output);
PHP 8
Union types
class Number
{
private int|float $number;
public function setNumber(int|float $number): void {
$this->number = $number;
}
public
function getNumber(): int|float {
return $this->number;
}
}
https://wiki.php.net/rfc/union_types_v2
Fonctionnement d’un compilateur comme PHP
https://wiki.php.net/rfc/jit
index.php Bytcode
Code
machine
Compilation PHP VM d’exécution
Avec JIT
index.php Bytcode
Code
machine
Opcache VM d’exécution
Code
machine
Priorité de concaténation
echo "sum: " . $a + $b;
???
https://wiki.php.net/rfc/concatenation_precedence
Priorité de concaténation
echo "sum: " . $a + $b;
echo $a + $b . " €";
Aujourd’hui :
● “.” et “+” au même niveau
● évaluation de gauche à droite)
Priorité de concaténation
echo "sum: " . $a + $b;
=> Aujourd’hui
echo ("sum: " . $a) + $b;
=>
Warning
echo $a + $b . " €";
=> Aujourd’hui
echo ($a + $b) . " €";
=>
OK
Priorité de concaténation
echo "sum: " . $a + $b;
echo $a + $b . " €";
PHP 8.0 :
● “+” à une priorité supérieur à “.”
Priorité de concaténation
echo "sum: " . $a + $b;
=> Aujourd’hui
echo "sum: " . ($a + $b);
=>
OK
echo $a + $b . " €";
=> Aujourd’hui
echo ($a + $b) . " €";
=>
OK
Quelques liens RFC :
https://wiki.php.net/rfc#php_74
Changelog :
https://www.php.net/manual/fr/doc.changelog.php
Github :
https://github.com/php/php-src/blob/PHP-7.4/UPG
RADING
Merci
Des questions ?

Weitere ähnliche Inhalte

Was ist angesagt?

Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantHugo Hamon
 
ZendFramework2 - Présentation
ZendFramework2 - PrésentationZendFramework2 - Présentation
ZendFramework2 - Présentationjulien pauli
 
Formation PHP
Formation PHPFormation PHP
Formation PHPkemenaran
 
PHP 1 - Apprendre les bases
PHP 1 - Apprendre les basesPHP 1 - Apprendre les bases
PHP 1 - Apprendre les basesPierre Faure
 
Introduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINE
Introduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINEIntroduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINE
Introduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINEMarouan OMEZZINE
 
PHP - get started
PHP - get startedPHP - get started
PHP - get startedmazenovi
 
Anatomie d'une des particularité de la libc
Anatomie d'une des particularité de la libcAnatomie d'une des particularité de la libc
Anatomie d'une des particularité de la libcThierry Gayet
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDOAbdoulaye Dieng
 
Programmation orientée objet en PHP 5
Programmation orientée objet en PHP 5Programmation orientée objet en PHP 5
Programmation orientée objet en PHP 5Kristen Le Liboux
 
Php 2 - Approfondissement MySQL, PDO et MVC
Php 2 - Approfondissement MySQL, PDO et MVCPhp 2 - Approfondissement MySQL, PDO et MVC
Php 2 - Approfondissement MySQL, PDO et MVCPierre Faure
 
Presentation langage go_19022015
Presentation langage go_19022015Presentation langage go_19022015
Presentation langage go_19022015Stéphane Legrand
 
Introduction au langage PHP (2éme partie) élaborée par Marouan OMEZZINE
Introduction au langage PHP (2éme partie) élaborée par Marouan OMEZZINEIntroduction au langage PHP (2éme partie) élaborée par Marouan OMEZZINE
Introduction au langage PHP (2éme partie) élaborée par Marouan OMEZZINEMarouan OMEZZINE
 
Pratique de la programmation en go
Pratique de la programmation en goPratique de la programmation en go
Pratique de la programmation en gokader15
 
.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHPAbdoulaye Dieng
 

Was ist angesagt? (19)

Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
 
Formation python 3
Formation python 3Formation python 3
Formation python 3
 
ZendFramework2 - Présentation
ZendFramework2 - PrésentationZendFramework2 - Présentation
ZendFramework2 - Présentation
 
Formation PHP
Formation PHPFormation PHP
Formation PHP
 
PHP 1 - Apprendre les bases
PHP 1 - Apprendre les basesPHP 1 - Apprendre les bases
PHP 1 - Apprendre les bases
 
Nouveautés php 7
Nouveautés php 7Nouveautés php 7
Nouveautés php 7
 
Introduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINE
Introduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINEIntroduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINE
Introduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINE
 
Php cours
Php coursPhp cours
Php cours
 
PHP - get started
PHP - get startedPHP - get started
PHP - get started
 
Anatomie d'une des particularité de la libc
Anatomie d'une des particularité de la libcAnatomie d'une des particularité de la libc
Anatomie d'une des particularité de la libc
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDO
 
Programmation orientée objet en PHP 5
Programmation orientée objet en PHP 5Programmation orientée objet en PHP 5
Programmation orientée objet en PHP 5
 
Php 2 - Approfondissement MySQL, PDO et MVC
Php 2 - Approfondissement MySQL, PDO et MVCPhp 2 - Approfondissement MySQL, PDO et MVC
Php 2 - Approfondissement MySQL, PDO et MVC
 
Php seance1
Php seance1Php seance1
Php seance1
 
Presentation langage go_19022015
Presentation langage go_19022015Presentation langage go_19022015
Presentation langage go_19022015
 
Introduction au langage PHP (2éme partie) élaborée par Marouan OMEZZINE
Introduction au langage PHP (2éme partie) élaborée par Marouan OMEZZINEIntroduction au langage PHP (2éme partie) élaborée par Marouan OMEZZINE
Introduction au langage PHP (2éme partie) élaborée par Marouan OMEZZINE
 
Pratique de la programmation en go
Pratique de la programmation en goPratique de la programmation en go
Pratique de la programmation en go
 
Bash bonnes pratiques
Bash bonnes pratiquesBash bonnes pratiques
Bash bonnes pratiques
 
.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP
 

Ähnlich wie Php 7.4 2020-01-28 - afup

Migration PHP4-PHP5
Migration PHP4-PHP5Migration PHP4-PHP5
Migration PHP4-PHP5julien pauli
 
PHPTour-2011-PHP_Extensions
PHPTour-2011-PHP_ExtensionsPHPTour-2011-PHP_Extensions
PHPTour-2011-PHP_Extensionsjulien pauli
 
Introduction à Symfony2
Introduction à Symfony2Introduction à Symfony2
Introduction à Symfony2Hugo Hamon
 
Php 7 Think php7
Php 7 Think php7Php 7 Think php7
Php 7 Think php7neuros
 
Tout pour se préparer à PHP 7.4
Tout pour se préparer à PHP 7.4Tout pour se préparer à PHP 7.4
Tout pour se préparer à PHP 7.4Damien Seguy
 
Cours php -partie 1.pdf
Cours php -partie 1.pdfCours php -partie 1.pdf
Cours php -partie 1.pdfssuserc46a93
 
Cours Programmation web en PHP Cours Programmation web en PHP
Cours Programmation web en PHP Cours Programmation web en PHPCours Programmation web en PHP Cours Programmation web en PHP
Cours Programmation web en PHP Cours Programmation web en PHPBassim ELKHATTABY
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHPjulien pauli
 
Mieux Développer en PHP avec Symfony
Mieux Développer en PHP avec SymfonyMieux Développer en PHP avec Symfony
Mieux Développer en PHP avec SymfonyHugo Hamon
 
PHP 5.3, PHP Next
PHP 5.3, PHP NextPHP 5.3, PHP Next
PHP 5.3, PHP NextSQLI
 
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...fdussert
 
20100221 my phingtool - blog
20100221   my phingtool - blog20100221   my phingtool - blog
20100221 my phingtool - blogPHPPRO
 
Présentation de PHP 5.4 [FR]
Présentation de PHP 5.4 [FR]Présentation de PHP 5.4 [FR]
Présentation de PHP 5.4 [FR]Wixiweb
 
Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !Engineor
 

Ähnlich wie Php 7.4 2020-01-28 - afup (20)

Playing With PHP 5.3
Playing With PHP 5.3Playing With PHP 5.3
Playing With PHP 5.3
 
Migration PHP4-PHP5
Migration PHP4-PHP5Migration PHP4-PHP5
Migration PHP4-PHP5
 
PHPTour-2011-PHP_Extensions
PHPTour-2011-PHP_ExtensionsPHPTour-2011-PHP_Extensions
PHPTour-2011-PHP_Extensions
 
Php 5.3
Php 5.3Php 5.3
Php 5.3
 
Introduction à Symfony2
Introduction à Symfony2Introduction à Symfony2
Introduction à Symfony2
 
Php 7 Think php7
Php 7 Think php7Php 7 Think php7
Php 7 Think php7
 
Tout pour se préparer à PHP 7.4
Tout pour se préparer à PHP 7.4Tout pour se préparer à PHP 7.4
Tout pour se préparer à PHP 7.4
 
Cours php -partie 1.pdf
Cours php -partie 1.pdfCours php -partie 1.pdf
Cours php -partie 1.pdf
 
Cours Programmation web en PHP Cours Programmation web en PHP
Cours Programmation web en PHP Cours Programmation web en PHPCours Programmation web en PHP Cours Programmation web en PHP
Cours Programmation web en PHP Cours Programmation web en PHP
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHP
 
Mieux Développer en PHP avec Symfony
Mieux Développer en PHP avec SymfonyMieux Développer en PHP avec Symfony
Mieux Développer en PHP avec Symfony
 
PHP 5.3, PHP Next
PHP 5.3, PHP NextPHP 5.3, PHP Next
PHP 5.3, PHP Next
 
Lp web tp3_idse
Lp web tp3_idseLp web tp3_idse
Lp web tp3_idse
 
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
 
Des tests modernes pour Drupal
Des tests modernes pour DrupalDes tests modernes pour Drupal
Des tests modernes pour Drupal
 
20100221 my phingtool - blog
20100221   my phingtool - blog20100221   my phingtool - blog
20100221 my phingtool - blog
 
Présentation de PHP 5.4 [FR]
Présentation de PHP 5.4 [FR]Présentation de PHP 5.4 [FR]
Présentation de PHP 5.4 [FR]
 
Compteur de visites
Compteur de visitesCompteur de visites
Compteur de visites
 
La première partie de la présentation PHP
La première partie de la présentation PHPLa première partie de la présentation PHP
La première partie de la présentation PHP
 
Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !
 

Mehr von Julien Vinber

Swoole Meetup AFUP¨Montpellier 27/01/2021
Swoole   Meetup  AFUP¨Montpellier 27/01/2021Swoole   Meetup  AFUP¨Montpellier 27/01/2021
Swoole Meetup AFUP¨Montpellier 27/01/2021Julien Vinber
 
Et si on en finissait avec CRUD ?
Et si on en finissait avec CRUD ?Et si on en finissait avec CRUD ?
Et si on en finissait avec CRUD ?Julien Vinber
 
Meet up symfony 16 juin 2017 - Les PSR
Meet up symfony 16 juin 2017 -  Les PSRMeet up symfony 16 juin 2017 -  Les PSR
Meet up symfony 16 juin 2017 - Les PSRJulien Vinber
 
Meet up symfony 11 octobre 2016 - Les formulaire
Meet up symfony 11 octobre 2016 - Les formulaireMeet up symfony 11 octobre 2016 - Les formulaire
Meet up symfony 11 octobre 2016 - Les formulaireJulien Vinber
 
Meetup symfony 30 janvier 2017 - événement
Meetup symfony 30 janvier 2017 - événementMeetup symfony 30 janvier 2017 - événement
Meetup symfony 30 janvier 2017 - événementJulien Vinber
 

Mehr von Julien Vinber (8)

PHP8.2_SF8.2.pdf
PHP8.2_SF8.2.pdfPHP8.2_SF8.2.pdf
PHP8.2_SF8.2.pdf
 
Sulu LE CMS Ultime
Sulu LE CMS UltimeSulu LE CMS Ultime
Sulu LE CMS Ultime
 
Swoole Meetup AFUP¨Montpellier 27/01/2021
Swoole   Meetup  AFUP¨Montpellier 27/01/2021Swoole   Meetup  AFUP¨Montpellier 27/01/2021
Swoole Meetup AFUP¨Montpellier 27/01/2021
 
Et si on en finissait avec CRUD ?
Et si on en finissait avec CRUD ?Et si on en finissait avec CRUD ?
Et si on en finissait avec CRUD ?
 
Symfony vs laravel
Symfony vs  laravelSymfony vs  laravel
Symfony vs laravel
 
Meet up symfony 16 juin 2017 - Les PSR
Meet up symfony 16 juin 2017 -  Les PSRMeet up symfony 16 juin 2017 -  Les PSR
Meet up symfony 16 juin 2017 - Les PSR
 
Meet up symfony 11 octobre 2016 - Les formulaire
Meet up symfony 11 octobre 2016 - Les formulaireMeet up symfony 11 octobre 2016 - Les formulaire
Meet up symfony 11 octobre 2016 - Les formulaire
 
Meetup symfony 30 janvier 2017 - événement
Meetup symfony 30 janvier 2017 - événementMeetup symfony 30 janvier 2017 - événement
Meetup symfony 30 janvier 2017 - événement
 

Php 7.4 2020-01-28 - afup

  • 1. PHP 7.4 Nouveautés Julien Vinber - Meetup AFUP Montpellier 28 janvier 2020 - Crealead
  • 2. Julien Vinber Slack Mth : @julienvinber LinkedIn : @julienvinber ● Lead Dev chez Qape ● Dev PHP/Symfony ● Dev depuis plus de 15 ans ● Coordinateur AFUP Montpellier
  • 4.
  • 6. Typed properties <?php class Utilisateur73 { /** * @var int */ public $id; /** * @var string */ public $nom; /** * @var string|null */ public $prenom; } <?php class Utilisateur74 { public int $id; public string $nom; public ?string $prenom; } https://wiki.php.net/rfc/typed_properties_v2
  • 7. Type de retour covariant interface CollectionInterface { public function premier(): ItemInterface; } class CollectionUtilisateur implements CollectionInterface { public function premier(): Utilisateur { } } class Item { public string $nom; } class Utilisateur extends Item {} https://wiki.php.net/rfc/covariant-returns-and-contravariant-parameters
  • 8. Type de paramètre contravariant interface CollectionInterface { public function ajouter(Item $item): void; } class CollectionUtilisateur implements CollectionInterface { public function ajouter(Utilisateur $utilisateur): void; { } } class Item { public string $nom; } class Utilisateur extends Item {} https://wiki.php.net/rfc/covariant-returns-and-contravariant-parameters
  • 9. class CollectionParent { public function ajouter(Utilisateur $utilisateur):void {print($utilisateur);} } class CollectionEnfant extends CollectionParent { public function ajouter(Item $utilisateur):void {print($utilisateur);} } class Item { public string $nom; } class Utilisateur extends Item {}
  • 10. Nouvelle solution pour sérialiser un objet https://wiki.php.net/rfc/custom_object_serialization
  • 11. Serializable class A implements Serializable { private $prop; public function serialize() { return serialize($this->prop); } public function unserialize($payload) { $this->prop = unserialize($payload); } } class B extends A { private $prop; public function serialize() { return serialize([$this->prop, parent::serialize()]) } public function unserialize($payload) { [$prop, $parent] = unserialize($payload); parent::unserialize($parent); $this->prop = $prop; } } __sleep / __wakeup class A implements Serializable { private $ttc; private $ht; public function __sleep() { return [‘ht’]; } public function __wakeup() { $this->ttc = $ht * 1.2; } }
  • 12. Nouvelle solution : class A { private $prop_a; public function __serialize(): array { return ["prop_a" => $this->prop_a]; } public function __unserialize(array $data) { $this->prop_a = $data["prop_a"]; } } class B extends A { private $prop_b; public function __serialize(): array { return [ "prop_b" => $this->prop_b, "parent_data" => parent::__serialize(), ]; } public function __unserialize(array $data) { parent::__unserialize($data["parent_data"]); $this->prop_b = $data["prop_b"]; } }
  • 13. Weak References $object = new stdClass; $weakRef = WeakReference::create($object); var_dump($weakRef->get()); //object(stdClass)#1 (0) {} unset($object); var_dump($weakRef->get()); //null https://wiki.php.net/rfc/weakrefs
  • 18. Preloading index.php execution index.php execution lib1.php Avec OPCache : ensuite ... OPCACHE index.php OPCACHE lib1.php
  • 19. Preloading C’est mieux, mais il reste la première fois.
  • 20. Preloading Nouveau avec PHP 7.4 le preloading : ; php.ini opcache.preload=/path/monfichier.php
  • 21. Preloading Exemple avec SF5/SF4.4 ; php.ini opcache.preload=/path/to/project/var/cache/prod/App_KernelPro dContainer.preload.php
  • 22. /** * Get files that specified suffix * @param $path * @param array $files * @return array */ function getfiles( $path , &$files = array() ) { if ( !is_dir( $path ) ) return null; $handle = opendir( $path ); while ( false !== ( $file = readdir( $handle ) ) ) { if ( $file != '.' && $file != '..' ) { $path2 = $path . '/' . $file; if ( is_dir( $path2 ) ) { getfiles( $path2 , $files ); } else { if ( preg_match( "/.(php|php5)$/i" , $file ) ) { $files[] = $path2; } } } } return $files; } $files = getfiles('/png/www/example.com/public_html/app/wordpress'); $br = (php_sapi_name() == "cli") ? "n" : "<br />"; foreach($files as $file){ opcache_compile_file($file); echo $file.$br; }
  • 23. Preloading ATTENTION : à réserver pour la prod MAJ => recharger PHP
  • 25. Un peu de sucre...
  • 26. ... Existe depuis la 5.6 Permet de “packager” des arguments function test($arg1, $arg2, $arg3 = null) { var_dump($arg1, $arg2, $arg3); } test(...[1, 2]); // 1, 2 test(...[1, 2, 3]); // 1, 2, 3 test(...[1, 2, 3, 4]); // 1, 2, 3 (remaining arg is not captured by the function declaration) https://wiki.php.net/rfc/spread_operator_for_array
  • 27. ... En PHP 7.4 Étendu sur les Array $parts = ['apple', 'pear']; $fruits = ['banana', 'orange', ...$parts, 'watermelon']; var_dump($fruits);
  • 28. ... La source peut être un tableau, un Traversable ou générateur. function generator() { for ($i = 3; $i <= 5; $i++) { yield $i; } } $arr1 = [0, 1, 2, ...generator()];
  • 29. Fonctions anonymes courts Les fonctions anonymes sont arrivées en 5.3 function array_values_from_keys($arr, $keys) { return array_map(function ($x) use ($arr) { return $arr[$x]; }, $keys); } En 7.4 function array_values_from_keys($arr, $keys) { return array_map(fn($x) => $arr[$x], $keys); } https://wiki.php.net/rfc/arrow_functions_v2
  • 30. Assignation Coalesce Null Depuis 7.0 $username = $_GET['user'] ?? 'nobody'; En 7.4 $valeur ??= 'nada'; https://wiki.php.net/rfc/null_coalesce_equal_operator
  • 31. Séparateur neutre pour les nombres. $nombre = 1000000000; $nombre = 1_000_000_000; Attention : à utiliser uniquement entre 2 chiffres “100_” n’est pas autorisé. https://wiki.php.net/rfc/numeric_literal_separator
  • 32. FFI
  • 33. FFI - Foreign Function Interface Permet de s’interfacer directement en PHP à des bibliothèques externes (.so, .dll) Sans extension PHP à écrite dans un Autre langage et à installer spécifiquement sur le serveur. https://wiki.php.net/rfc/ffi
  • 34. Comment cela marche? ● On prend une librairie existante ou nous créons notre propre librairie. ● On récupère ou on crée le fichiers .h de cette librairie ● On charge la librairie. ● On peut l’utiliser.
  • 35. Un exemple volé emprunté chez jolicode Utilisation de la librairie libuuid https://jolicode.com/blog/php-7-4-et-ffi-ce-quil-faut-retenir
  • 36. Le fichier .h origine.
  • 37. Le fichier .h nétoyer
  • 38. Utilisation en PHP <?php $ffi = FFI::load(__DIR__ . '/include/uuid-php.h'); $output = $ffi->new('uuid_t'); $ffi->uuid_generate_random($output); $uuid = sprintf('%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x', ...$output);
  • 39. PHP 8
  • 40. Union types class Number { private int|float $number; public function setNumber(int|float $number): void { $this->number = $number; } public function getNumber(): int|float { return $this->number; } } https://wiki.php.net/rfc/union_types_v2
  • 41. Fonctionnement d’un compilateur comme PHP https://wiki.php.net/rfc/jit index.php Bytcode Code machine Compilation PHP VM d’exécution
  • 42. Avec JIT index.php Bytcode Code machine Opcache VM d’exécution Code machine
  • 43. Priorité de concaténation echo "sum: " . $a + $b; ??? https://wiki.php.net/rfc/concatenation_precedence
  • 44. Priorité de concaténation echo "sum: " . $a + $b; echo $a + $b . " €"; Aujourd’hui : ● “.” et “+” au même niveau ● évaluation de gauche à droite)
  • 45. Priorité de concaténation echo "sum: " . $a + $b; => Aujourd’hui echo ("sum: " . $a) + $b; => Warning echo $a + $b . " €"; => Aujourd’hui echo ($a + $b) . " €"; => OK
  • 46. Priorité de concaténation echo "sum: " . $a + $b; echo $a + $b . " €"; PHP 8.0 : ● “+” à une priorité supérieur à “.”
  • 47. Priorité de concaténation echo "sum: " . $a + $b; => Aujourd’hui echo "sum: " . ($a + $b); => OK echo $a + $b . " €"; => Aujourd’hui echo ($a + $b) . " €"; => OK
  • 48. Quelques liens RFC : https://wiki.php.net/rfc#php_74 Changelog : https://www.php.net/manual/fr/doc.changelog.php Github : https://github.com/php/php-src/blob/PHP-7.4/UPG RADING