Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Tout pour se préparer à PHP 7.4

467 views

Published on

Déjà, PHP 7.4 toque à la porte, et il arrive les bras chargés de fonctionnalités et de modernisations. Que ce soit les FFI, le support du typage pour les propriétés, l’abandon des nombres real, la covariance, et même la modernisation de strip_tags, array_merge sans argument, et l’imbrication d’opérateurs ternaires : ouf, il va falloir se retrousser les manches. Durant la session, nous passerons en revue les nouvelles fonctionnalités, les incompatibilités, et nous verrons comment préparer son code dès maintenant.

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Tout pour se préparer à PHP 7.4

  1. 1. TOUT POUR SE PRÉPARER À PHP 7.4 Avec la participation de PaulVerlaine
  2. 2. PROGRAMME • Incompatibilités • Nouveautés • Divers
  3. 3. QUI PARLE? • Damien Seguy • CTO @exakat • Analyse statique PHP • Maison de retraite à éléphpants • Record mondial du nombre d'antennes AFUP visitées
  4. 4. AGENDA • PHP 7.4.0 RC4 • PHP 7.4.0 RC5 : 31 octobre 2019 • Compilez PHP • https://github.com/php/php-src • https://bugs.php.net/ • Compilez votre code : php -l • php paralell lint 28 nov 2019
  5. 5. INCOMPATIBILITÉS
  6. 6. TERNAIRES IMBRIQUÉS <?php 1 ? 2 :  3 ?  4 : 5;  //  (1 ? 2 : 3) ? 4 : 5;  // ok 1 ? 2 : (3 ?  4 : 5); // ok 1 ? 2 ?  3 :  4 : 5;  // ok ?>
  7. 7. EXIT LES SHORTTAG <? phpinfo(); ?><?php <? phpinfo(); ?><?php • Les balises de fin de document changent
  8. 8. PRÉSÉANCE + ET . <?php echo 'Nous étions le '. date('d') - 7  . ' mars'; echo 'Nous étions le '. (date('d') - 7) . ' mars'; ?> • Valable aussi pour << >> • *, **, % sont inchangés
  9. 9. ACCÈSTABLEAUX ACCOLADES <?php  $string = 'abc';  echo $string[1];  echo $string{2};  ?> PHP Deprecated: Array and string offset access syntax with curly braces is deprecated
  10. 10. ACCÈSTABLEAU AUX SCALAIRES <?php $integer = 1; echo $integer[1]; $string = 'abc'; echo $string[1]; ?> PHP Notice: Trying to access array offset on value of type int
  11. 11. PLUS DE REAL <?php  $string = '1.2';  $real  = (real)  $string; $float  = (float) $string; ?> • Uniquement du float • is_real() et (real) PHP Deprecated: The (real) cast is deprecated, use (float) instead
  12. 12. ARRAY_KEY_EXISTS() Deprecated: array_key_exists(): Using array_key_exists() on objects is deprecated. Use isset() or property_exists() instead <?php  $objet = new stdclass; $objet->p = 1; var_dump(array_key_exists('p', $objet)); ?> • array_key_exists() a été accéléré
  13. 13. MODERNISATIONS
  14. 14. SÉPARATEUR NUMÉRIQUE <?php 6.674_083e-11;  // float 22_99_79_24_58;   // decimal 0xCAFE_F00D;    // hexadecimal 0B0101_1111;    // binaire ?>
  15. 15. SÉPARATEUR NUMÉRIQUE <?php const _21_ = 22; echo  _21_; ?>
  16. 16. PROPRIÉTÉSTYPÉES <?php class User {     public int $id;     public string $name; public Stdclass $x; } ?>
  17. 17. PROPRIÉTÉSTYPÉES <?php  class User {      public Stdclass $x;          function foo() {         $this->x = new Stdclass;     } }  $a = new User; $a->foo(); var_dump($a->x); ?> Fatal error: Uncaught Error: Typed property User::$x must not be accessed before initialization
  18. 18. OPÉRATEUR … POUR ARRAY <?php $parts = ['PHP', 'elephpant', ]; $afup  = ['forum', 'antennes', ...$parts, 'génial']; // ['PHP', 'elephpant', 'forum', 'antennes', 'génial' ?> • Ne marche pas avec des hash
  19. 19. FONCTIONS FLÈCHÉES <?php $puissance = 2; $valeurs = [1, 2, 3, 4]; $carres = array_map( fn($n) => $n ** $puissance,  $valeurs ); // $carres = array(1, 4, 9, 16); ?>
  20. 20. FONCTIONS FLÈCHÉES <?php $puissance = 2; $valeurs = [1, 2, 3, 4]; $closure = function (&$n, $k) use ($puissance) {    $n = $n ** $puissance; }; array_map($valeurs, $closure); ?>
  21. 21. CONTRAVARIANT COVARIANT <?php   // class/interface b extends a {} class c1 {      function foo(b $arg) : a {}  }  class c2 extends c1 {      function foo(b $arg) : a {}  } 
  22. 22. CONTRAVARIANT COVARIANT <?php    // class/interface b extends a {} class c1 {       function foo(a $arg) : b {}   }   class c2 extends c1 {       function foo(b $arg) : a {}   }  Fatal error: Declaration of b::foo(a2 $arg): b1 must be compatible with a::foo(b1 $arg): a2 in test.php on line 10
  23. 23. <?php  // class/interface b extends a {} class c1 {     function foo(b $arg) : a {} } class c2 extends c1 {     function foo(a $arg) : b {} } CONTRAVARIANT COVARIANT
  24. 24. CONTRAVARIANT COVARIANT 1.Toutes les définitions le même fichier 2.L'autoload est obligatoire • Moins de vérifications avec le lint PHP Fatal error: Could not check compatibility between UserFactory::make(object $arg): User and Factory::make(User $arg): object, because class User is not available
  25. 25. ??= <?php $res = shell_exec($cmd) ?? ''; function foo($arg) {   $arg = $arg ?? '';   $arg ??= ''; } foo($arg); bar($arg ?? ''); ?>
  26. 26. ARRAY_MERGE() <?php $rows = [[1,2,3], [4,5,6]]; $list = array_merge(...$rows); $rows = []; $list = array_merge(...$rows); ?>
  27. 27. RÉFÉRENCES FAIBLES <?php $obj = new stdClass; $weakref = WeakReference::create($obj); var_dump($weakref->get()); unset($obj); var_dump($weakref->get()); ?>
  28. 28. RÉFÉRENCES FAIBLES • PHP conserve tous les objets qui sont référencés en mémoire • Valable en cas d'utilisation du GC CachePHP DB
  29. 29. STRIP_TAGS() <?php $string = '<a><b><c>'; echo strip_tags($string, '<a><b>'); echo strip_tags($string, ['<a>', '<b>']); ?>
  30. 30. PROC_OPEN() <?php proc_open(['php', '-r',  'echo "Hello Worldn";'],  $descriptors, $pipes); shell_exec("php -r " . escapeshellargs('echo "Hello Worldn";')); ?>
  31. 31. PREG_UNMATCHED_AS_NULL <?php preg_match('/(a)(b)?/', 'abc', $r); /* Array (     [0] => ab     [1] => a     [2] => b ) */
  32. 32. PREG_UNMATCHED_AS_NULL <?php preg_match('/(a)(b)?/', 'amc', $r); /* Array (     [0] => a     [1] => a ) */
  33. 33. PREG_UNMATCHED_AS_NULL <?php preg_match('/(a)(b)?/', 'amc', $r, PREG_UNMATCHED_AS_NULL); /* Array (     [0] => a     [1] => a     [2] => NULL ) */
  34. 34. SERIALISATION NOUVELLE • __sleep()/__wake() • Serializable interface • __serialize() / __unserialize() • Gère les classes parent • Plus simple à déserialiser
  35. 35. SERIALISATION NOUVELLE 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"];     } }
  36. 36. DIVERS
  37. 37. PRELOADING app.php framework.php Autoload Output app.phpwork.php Output
  38. 38. <?php // create FFI object, loading libc and
 // exporting function printf() $ffi = FFI::cdef(     "int printf(const char *format, ...);", 
 // this is a regular C declaration     "libc.so.6"); // call C's printf() $ffi->printf("Hello %s!n", "world"); ?> FOREIGN FUNCTION INTERFACE • ffi.enable = false
  39. 39. • ext/wddx se retire • ext/hash s'impose • PEAR est définitivement mort • money_format() se retire • Les classes sans parent ne compile plus parent::
  40. 40. MOINS D'ERREURS 0 125 250 375 500 PHP 5.0 PHP 5.1 PHP 5.2 PHP 5.3 PHP 5.4 PHP 5.5 PHP 5.6 PHP 7.0 PHP 7.1 PHP 7.2 PHP 7.3 PHP 7.4 PHP 8.0 Message d’erreur distinct
  41. 41. PERFORMANCES • Gain de performances • 1 à 5 % par rapport à PHP 7.3 • Potentiel de gain avec ext/FFI • Potentiel de pertes avec les propriétés typées • Ne pas les utiliser est plus lent!!
  42. 42. AIDE À LA MIGRATION • Exakat • Rapports 7.x • Suggestions • PHPCompatibility • PHP CS
  43. 43. BON PHP 7.4! @exakat

×