1<?php 2$_SERVER['BASE_PAGE'] = 'releases/8.0/en.php'; 3include_once __DIR__ . '/common.php'; 4 5releases\php80\common_header( 6 "PHP 8.0 est une mise à jour majeure du langage PHP. " . 7 "Elle contient beaucoup de nouvelle fonctionnalités et d'optimisations, " . 8 "incluant les arguments nommés, les types d'union, attributs, " . 9 "promotion de propriétés de constructeur, l'expression match, " . 10 "l'opérateur nullsafe, JIT (Compilation à la Volée), " . 11 "et des améliorations dans le système de typage, " . 12 "la gestion d'erreur, et de cohérence."); 13 14?> 15<section class="php8-section php8-section_dark php8-section_header center"> 16 <div class="page-tools"> 17 <div class="change-language"> 18 <?php releases\php80\language_chooser('fr'); ?> 19 </div> 20 </div> 21 <div class="php8-section__content"> 22 <div class="php8-logo"> 23 <img src="/images/php8/logo_php8.svg" alt="php8" height="126" width="343"> 24 </div> 25 <div class="php8-title">Released!</div> 26 <div class="php8-subtitle"> 27 PHP 8.0 est une mise à jour majeure du langage PHP.<br class="display-none-md"> 28 Elle contient beaucoup de nouvelles fonctionnalités et d'optimisations, incluant les arguments nommés, 29 les types d'union, attributs, promotion de propriété de constructeur, l'expression match, l'opérateur 30 nullsafe, JIT (Compilation à la Volée), et des améliorations dans le système de typage, la gestion 31 d'erreur, et de cohérence. 32 </div> 33 <div class="php8-button-wrapper center"> 34 <a class="php8-button php8-button_light" href="/downloads">Migrez à PHP 8 maintenant!</a> 35 </div> 36 </div> 37</section> 38 39<section class="php8-section center"> 40 <div class="php8-compare"> 41 <h2 class="php8-h2" id="named-arguments"> 42 Arguments nommés 43 <a class="php8-rfc" href="https://wiki.php.net/rfc/named_params">RFC</a> 44 </h2> 45 <div class="php8-compare__main"> 46 <div class="php8-compare__block example-contents"> 47 <div class="php8-compare__label">PHP 7</div> 48 <div class="php8-code phpcode"> 49 <?php highlight_php_trimmed( 50 'htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, \'UTF-8\', false);', 51 );?> 52 </div> 53 54 55 </div> 56 <div class="php8-compare__arrow"></div> 57 <div class="php8-compare__block example-contents"> 58 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 59 <div class="php8-code phpcode"> 60 <?php highlight_php_trimmed( 61 'htmlspecialchars($string, double_encode: false);', 62 );?> 63 </div> 64 </div> 65 </div> 66 <div class="php8-compare__content"> 67 <ul> 68 <li>Spécifiez uniquement les paramètres requis, omettant ceux optionnels.</li> 69 <li>Les arguments sont indépendants de l'ordre et auto-documentés.</li> 70 </ul> 71 </div> 72 </div> 73 74 <div class="php8-compare"> 75 <h2 class="php8-h2" id="attributes"> 76 Attributs 77 <a class="php8-rfc" href="https://wiki.php.net/rfc/attributes_v2">RFC</a> <a class="php8-rfc" href="/manual/fr/language.attributes.php">Doc</a> 78 </h2> 79 <div class="php8-compare__main"> 80 <div class="php8-compare__block example-contents"> 81 <div class="php8-compare__label">PHP 7</div> 82 <div class="php8-code phpcode"> 83 <?php highlight_php_trimmed( 84 '/** 85* @Route("/api/posts/{id}", methods={"GET", "HEAD"}) 86*/ 87class User 88{', 89 );?> 90 </div> 91 </div> 92 <div class="php8-compare__arrow"></div> 93 <div class="php8-compare__block example-contents"> 94 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 95 <div class="php8-code phpcode"> 96 <?php highlight_php_trimmed( 97 '#[Route("/api/posts/{id}", methods: ["GET", "HEAD"])] 98class User 99{', 100 );?> 101 </div> 102 </div> 103 </div> 104 <div class="php8-compare__content"> 105 <p>Au lieux d'annotations PHPDoc, vous pouvez désormais utiliser les métadonnées structurés avec la syntaxe native de PHP.</p> 106 </div> 107 </div> 108 109 <div class="php8-compare"> 110 <h2 class="php8-h2" id="constructor-property-promotion"> 111 Promotion de propriétés de constructeur 112 <a class="php8-rfc" href="https://wiki.php.net/rfc/constructor_promotion">RFC</a> <a class="php8-rfc" href="/manual/fr/language.oop5.decon.php#language.oop5.decon.constructor.promotion">Doc</a> 113 </h2> 114 <div class="php8-compare__main"> 115 <div class="php8-compare__block example-contents"> 116 <div class="php8-compare__label">PHP 7</div> 117 <div class="php8-code phpcode"> 118 <?php highlight_php_trimmed( 119 'class Point { 120 public float $x; 121 public float $y; 122 public float $z; 123 124 public function __construct( 125 float $x = 0.0, 126 float $y = 0.0, 127 float $z = 0.0 128 ) { 129 $this->x = $x; 130 $this->y = $y; 131 $this->z = $z; 132 } 133}', 134 );?> 135 </div> 136 </div> 137 <div class="php8-compare__arrow"></div> 138 <div class="php8-compare__block example-contents"> 139 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 140 <div class="php8-code phpcode"> 141 <?php highlight_php_trimmed( 142 'class Point { 143 public function __construct( 144 public float $x = 0.0, 145 public float $y = 0.0, 146 public float $z = 0.0, 147 ) {} 148}', 149 );?> 150 </div> 151 </div> 152 </div> 153 <div class="php8-compare__content"> 154 <p>Moins de code redondant pour définir et initialiser les propriétés.</p> 155 </div> 156 </div> 157 158 <div class="php8-compare"> 159 <h2 class="php8-h2" id="union-types"> 160 Types d'union 161 <a class="php8-rfc" href="https://wiki.php.net/rfc/union_types_v2">RFC</a> <a class="php8-rfc" href="/manual/fr/language.types.declarations.php#language.types.declarations.composite.union">Doc</a> 162 </h2> 163 <div class="php8-compare__main"> 164 <div class="php8-compare__block example-contents"> 165 <div class="php8-compare__label">PHP 7</div> 166 <div class="php8-code phpcode"> 167 <?php highlight_php_trimmed( 168 'class Number { 169 /** @var int|float */ 170 private $number; 171 172 /** 173 * @param float|int $number 174 */ 175 public function __construct($number) { 176 $this->number = $number; 177 } 178} 179 180new Number(\'NaN\'); // Ok', 181 );?> 182 </div> 183 </div> 184 <div class="php8-compare__arrow"></div> 185 <div class="php8-compare__block example-contents"> 186 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 187 <div class="php8-code phpcode"> 188 <?php highlight_php_trimmed( 189 'class Number { 190 public function __construct( 191 private int|float $number 192 ) {} 193} 194 195new Number(\'NaN\'); // TypeError', 196 );?> 197 </div> 198 </div> 199 </div> 200 <div class="php8-compare__content"> 201 <p> 202 Au lieu d'annotation PHPDoc pour une combinaison de type, vous pouvez utiliser les déclarations de types 203 d'union native qui sont validées lors de l'exécution. 204 </p> 205 </div> 206 </div> 207 208 <div class="php8-compare"> 209 <h2 class="php8-h2" id="match-expression"> 210 Expression match 211 <a class="php8-rfc" href="https://wiki.php.net/rfc/match_expression_v2">RFC</a> <a class="php8-rfc" href="/manual/fr/control-structures.match.php">Doc</a> 212 </h2> 213 <div class="php8-compare__main"> 214 <div class="php8-compare__block example-contents"> 215 <div class="php8-compare__label">PHP 7</div> 216 <div class="php8-code phpcode"> 217 <?php highlight_php_trimmed( 218 'switch (8.0) { 219 case \'8.0\': 220 $result = "Oh no!"; 221 break; 222 case 8.0: 223 $result = "This is what I expected"; 224 break; 225} 226echo $result; 227//> Oh no!', 228 );?> 229 </div> 230 </div> 231 <div class="php8-compare__arrow"></div> 232 <div class="php8-compare__block example-contents"> 233 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 234 <div class="php8-code phpcode"> 235 <?php highlight_php_trimmed( 236 'echo match (8.0) { 237 \'8.0\' => "Oh no!", 238 8.0 => "This is what I expected", 239}; 240//> This is what I expected', 241 );?> 242 </div> 243 </div> 244 </div> 245 <div class="php8-compare__content"> 246 <p>La nouvelle instruction match est similaire à switch et a les fonctionnalités suivantes :</p> 247 <ul> 248 <li>Match est une expression, signifiant que son résultat peut être enregistré dans une variable ou retourné.</li> 249 <li>Les branches de match supportent uniquement les expressions d'une seule ligne, et n'a pas besoin d'une déclaration break;.</li> 250 <li>Match fait des comparaisons strictes.</li> 251 </ul> 252 </div> 253 </div> 254 255 <div class="php8-compare"> 256 <h2 class="php8-h2" id="nullsafe-operator"> 257 Opérateur Nullsafe 258 <a class="php8-rfc" href="https://wiki.php.net/rfc/nullsafe_operator">RFC</a> 259 </h2> 260 <div class="php8-compare__main"> 261 <div class="php8-compare__block example-contents"> 262 <div class="php8-compare__label">PHP 7</div> 263 <div class="php8-code phpcode"> 264 <?php highlight_php_trimmed( 265 '$country = null; 266 267if ($session !== null) { 268 $user = $session->user; 269 270 if ($user !== null) { 271 $address = $user->getAddress(); 272 273 if ($address !== null) { 274 $country = $address->country; 275 } 276 } 277}', 278 );?> 279 </div> 280 </div> 281 <div class="php8-compare__arrow"></div> 282 <div class="php8-compare__block example-contents"> 283 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 284 <div class="php8-code phpcode"> 285 <?php highlight_php_trimmed( 286 '$country = $session?->user?->getAddress()?->country;', 287 );?> 288 </div> 289 </div> 290 </div> 291 <div class="php8-compare__content"> 292 <p> 293 Au lieu de faire des vérifications conditionnelles de null, vous pouvez utiliser une chaîne d'appel 294 avec le nouvel opérateur nullsafe. Qui lorsque l'évaluation d'un élément de la chaîne échoue, l'exécution 295 de la chaîne complète est terminée et la chaîne entière évalue à null. 296 </p> 297 </div> 298 </div> 299 300 <div class="php8-compare"> 301 <h2 class="php8-h2" id="saner-string-to-number-comparisons"> 302 Comparaisons entre les chaînes de caractères et les nombres plus saines 303 <a class="php8-rfc" href="https://wiki.php.net/rfc/string_to_number_comparison">RFC</a> 304 </h2> 305 <div class="php8-compare__main"> 306 <div class="php8-compare__block example-contents"> 307 <div class="php8-compare__label">PHP 7</div> 308 <div class="php8-code phpcode"> 309 <?php highlight_php_trimmed( 310 '0 == \'foobar\' // true', 311 );?> 312 </div> 313 </div> 314 <div class="php8-compare__arrow"></div> 315 <div class="php8-compare__block example-contents"> 316 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 317 <div class="php8-code phpcode"> 318 <?php highlight_php_trimmed( 319 '0 == \'foobar\' // false', 320 );?> 321 </div> 322 </div> 323 </div> 324 <div class="php8-compare__content"> 325 <p> 326 Lors de la comparaison avec une chaîne numérique, PHP 8 utilise une comparaison de nombre. 327 Sinon, il convertit le nombre à une chaîne de caractères et utilise une comparaison de chaîne de caractères. 328 </p> 329 </div> 330 </div> 331 332 <div class="php8-compare"> 333 <h2 class="php8-h2" id="consistent-type-errors-for-internal-functions"> 334 Erreurs de type cohérent pour les fonctions internes 335 <a class="php8-rfc" href="https://wiki.php.net/rfc/consistent_type_errors">RFC</a> 336 </h2> 337 <div class="php8-compare__main"> 338 <div class="php8-compare__block example-contents"> 339 <div class="php8-compare__label">PHP 7</div> 340 <div class="php8-code phpcode"> 341 <?php highlight_php_trimmed( 342 'strlen([]); // Warning: strlen() expects parameter 1 to be string, array given 343 344array_chunk([], -1); // Warning: array_chunk(): Size parameter expected to be greater than 0', 345 );?> 346 </div> 347 </div> 348 <div class="php8-compare__arrow"></div> 349 <div class="php8-compare__block example-contents"> 350 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 351 <div class="php8-code phpcode"> 352 <?php highlight_php_trimmed( 353 'strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given 354 355array_chunk([], -1); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0', 356 );?> 357 </div> 358 </div> 359 </div> 360 <div class="php8-compare__content"> 361 <p>La plupart des fonctions internes lancent désormais une exception Error si la validation du paramètre échoue.</p> 362 </div> 363 </div> 364</section> 365 366<section class="php8-section php8-section_light"> 367 <h2 class="php8-h2">Compilation Juste-à-Temps (JIT)</h2> 368 <p> 369 PHP 8 introduit deux moteurs de compilation JIT (juste à temps/compilation à la volée). 370 Le Tracing JIT, le plus prometteur des deux, montre environ 3 fois plus de performances sur des benchmarks 371 synthétiques et 1,5-2 fois plus de performances sur certaines applications à longue durée d'exécution. 372 Généralement les performances des applications sont identiques à PHP 7.4. 373 </p> 374 <h3 class="php8-h3"> 375 Contribution relative du JIT à la performance de PHP 8 376 </h3> 377 <p> 378 <img src="/images/php8/scheme.svg" width="900" alt="Just-In-Time compilation"> 379 </p> 380 381 <div class="php8-columns"> 382 <div class="php8-column"> 383 <h2 class="php8-h2 php8-h2_margin-top">Amélioration du système de typage et de la gestion d'erreur</h2> 384 <ul> 385 <li> 386 Vérification de type plus sévère pour les opérateurs arithmétiques et bit à bit 387 <a href="https://wiki.php.net/rfc/arithmetic_operator_type_checks">RFC</a> 388 </li> 389 <li> 390 Validation de méthode abstraite des traits <a href="https://wiki.php.net/rfc/abstract_trait_method_validation">RFC</a> 391 </li> 392 <li> 393 Signature valide des méthodes magiques <a href="https://wiki.php.net/rfc/magic-methods-signature">RFC</a> 394 </li> 395 <li> 396 Reclassifications des avertissements du moteur <a href="https://wiki.php.net/rfc/engine_warnings">RFC</a> 397 </li> 398 <li> 399 Erreur fatale pour des signatures de méthodes incompatibles <a href="https://wiki.php.net/rfc/lsp_errors">RFC</a> 400 </li> 401 <li> 402 L'opérateur @ ne silence plus les erreurs fatales. 403 </li> 404 <li> 405 Héritages avec les méthodes privées <a href="https://wiki.php.net/rfc/inheritance_private_methods">RFC</a> 406 </li> 407 <li> 408 Type mixed <a href="https://wiki.php.net/rfc/mixed_type_v2">RFC</a> 409 </li> 410 <li> 411 Type de retour static <a href="https://wiki.php.net/rfc/static_return_type">RFC</a> 412 </li> 413 <li> 414 Types pour les fonctions internes 415 <a href="https://externals.io/message/106522">Discussion e-mail</a> 416 </li> 417 <li> 418 Objets opaques au lieu de ressources pour les extensions 419 <a href="https://php.watch/versions/8.0/resource-CurlHandle">Curl</a>, 420 <a href="https://php.watch/versions/8.0/gdimage">Gd</a>, 421 <a href="https://php.watch/versions/8.0/sockets-sockets-addressinfo">Sockets</a>, 422 <a href="https://php.watch/versions/8.0/OpenSSL-resource">OpenSSL</a>, 423 <a href="https://php.watch/versions/8.0/xmlwriter-resource">XMLWriter</a>, et 424 <a href="https://php.watch/versions/8.0/xmlwriter-resource">XML</a> 425 </li> 426 </ul> 427 </div> 428 <div class="php8-column"> 429 <h2 class="php8-h2 php8-h2_margin-top">Autres ajustements de syntaxe et améliorations</h2> 430 <ul> 431 <li> 432 Autorisation des virgules trainantes dans les listes de paramètres <a href="https://wiki.php.net/rfc/trailing_comma_in_parameter_list">RFC</a> 433 et dans les listes des use d'une fermeture <a href="https://wiki.php.net/rfc/trailing_comma_in_closure_use_list">RFC</a> 434 </li> 435 <li> 436 Les catchs non capturant <a href="https://wiki.php.net/rfc/non-capturing_catches">RFC</a> 437 </li> 438 <li> 439 Ajustement de la Syntaxe des Variables <a href="https://wiki.php.net/rfc/variable_syntax_tweaks">RFC</a> 440 </li> 441 <li> 442 Traite les noms des espaces de nom comme un seul token <a href="https://wiki.php.net/rfc/namespaced_names_as_token">RFC</a> 443 </li> 444 <li> 445 Throw est désormais une expression <a href="https://wiki.php.net/rfc/throw_expression">RFC</a> 446 </li> 447 <li> 448 Autorisation de ::class sur les objets <a href="https://wiki.php.net/rfc/class_name_literal_on_object">RFC</a> 449 </li> 450 </ul> 451 452 <h2 class="php8-h2 php8-h2_margin-top">Nouvelles Classes, Interfaces, et Fonctions</h2> 453 <ul> 454 <li> 455 Classe <a href="https://wiki.php.net/rfc/weak_maps">Weak Map</a> 456 </li> 457 <li> 458 Interface <a href="https://wiki.php.net/rfc/stringable">Stringable</a> 459 </li> 460 <li> 461 <a href="https://wiki.php.net/rfc/str_contains">str_contains()</a>, 462 <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_starts_with()</a>, 463 <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_ends_with()</a> 464 </li> 465 <li> 466 <a href="https://github.com/php/php-src/pull/4769">fdiv()</a> 467 </li> 468 <li> 469 <a href="https://wiki.php.net/rfc/get_debug_type">get_debug_type()</a> 470 </li> 471 <li> 472 <a href="https://github.com/php/php-src/pull/5427">get_resource_id()</a> 473 </li> 474 <li> 475 Implémentation objet de <a href="https://wiki.php.net/rfc/token_as_object">token_get_all()</a> 476 </li> 477 <li> 478 <a href="https://wiki.php.net/rfc/dom_living_standard_api">Nouvelles APIs pour traverser et manipuler le DOM</a> 479 </li> 480 </ul> 481 </div> 482 </div> 483</section> 484 485<section class="php8-section php8-section_dark php8-section_footer php8-footer"> 486 <div class="php8-section__content"> 487 <h2 class="php8-h2 center"> 488 Meilleures performances, meilleure syntaxe, amélioration de la sécurité de type. 489 </h2> 490 <div class="php8-button-wrapper center"> 491 <a class="php8-button php8-button_light" href="/downloads">Migrez à PHP 8 maintenant!</a> 492 </div> 493 <div class="php8-footer__content"> 494 <p> 495 Pour le téléchargement des sources de PHP 8 veuillez visiter la page de <a href="http://www.php.net/downloads">téléchargement</a>. 496 Les binaires Windows peuvent être trouvés sur le site de <a href="http://windows.php.net/download">PHP pour Windows</a>. 497 La liste des changements est notée dans le <a href="http://www.php.net/ChangeLog-8.php">ChangeLog</a>. 498 </p> 499 <p> 500 Le <a href="/manual/fr/migration80.php">guide de migration</a> est disponible dans le manuel PHP. 501 Veuillez le consulter pour une liste détaillée des nouvelles fonctionnalités et changements non rétrocompatibles. 502 </p> 503 </div> 504 </div> 505</section> 506 507 508 509 510<?php site_footer(); 511