1<?php 2$_SERVER['BASE_PAGE'] = 'releases/8.0/pt_BR.php'; 3include_once __DIR__ . '/common.php'; 4 5releases\php80\common_header( 6 'PHP 8.0 é uma atualização importante da linguagem PHP. ' . 7 'Ela contém muitos novos recursos e otimizações, ' . 8 'incluindo argumentos nomeados, união de tipos, atributos, ' . 9 'promoção de propriedade do construtor, expressão match, ' . 10 'operador nullsafe, JIT e melhorias no sistema de tipos, ' . 11 'tratamento de erros e consistência.'); 12 13?> 14 <section class="php8-section php8-section_dark php8-section_header center"> 15 <div class="page-tools"> 16 <div class="change-language"> 17 <?php releases\php80\language_chooser('pt_BR'); ?> 18 </div> 19 </div> 20 <div class="php8-section__content"> 21 <div class="php8-logo"> 22 <img src="/images/php8/logo_php8.svg" alt="php8" height="126" width="343"> 23 </div> 24 <div class="php8-title">Released!</div> 25 <div class="php8-subtitle"> 26 PHP 8.0 é uma atualização importante da linguagem PHP. <br class="display-none-md"> Ela contém muitos novos 27 recursos e otimizações, incluindo argumentos nomeados, união de tipos, atributos, promoção de propriedade do 28 construtor, expressão match, operador nullsafe, JIT e melhorias no sistema de tipos, tratamento de 29 erros e consistência. 30 </div> 31 <div class="php8-button-wrapper center"> 32 <a class="php8-button php8-button_light" href="/downloads">Atualize para o PHP 8!</a> 33 </div> 34 </div> 35 </section> 36 37 <section class="php8-section center"> 38 <div class="php8-compare"> 39 <h2 class="php8-h2" id="named-arguments"> 40 Argumentos nomeados 41 <a class="php8-rfc" href="https://wiki.php.net/rfc/named_params">RFC</a> 42 </h2> 43 <div class="php8-compare__main"> 44 <div class="php8-compare__block example-contents"> 45 <div class="php8-compare__label">PHP 7</div> 46 <div class="php8-code phpcode"> 47 <?php highlight_php_trimmed( 48 'htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, \'UTF-8\', false);', 49 );?> 50 </div> 51 </div> 52 <div class="php8-compare__arrow"></div> 53 <div class="php8-compare__block example-contents"> 54 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 55 <div class="php8-code phpcode"> 56 <?php highlight_php_trimmed( 57 'htmlspecialchars($string, double_encode: false);', 58 );?> 59 </div> 60 </div> 61 </div> 62 <div class="php8-compare__content"> 63 <ul> 64 <li>Especifique apenas os parâmetros obrigatórios, pulando os opcionais.</li> 65 <li>Os argumentos são independentes da ordem e autodocumentados.</li> 66 </ul> 67 </div> 68 </div> 69 70 <div class="php8-compare"> 71 <h2 class="php8-h2" id="attributes"> 72 Atributos 73 <a class="php8-rfc" href="https://wiki.php.net/rfc/attributes_v2">RFC</a> <a class="php8-rfc" href="/manual/pt_BR/language.attributes.php">Doc</a> 74 </h2> 75 <div class="php8-compare__main"> 76 <div class="php8-compare__block example-contents"> 77 <div class="php8-compare__label">PHP 7</div> 78 <div class="php8-code phpcode"> 79 <?php highlight_php_trimmed( 80 'class PostsController 81{ 82 /** 83 * @Route("/api/posts/{id}", methods={"GET"}) 84 */ 85 public function get($id) { /* ... */ } 86}', 87 );?> 88 </div> 89 </div> 90 <div class="php8-compare__arrow"></div> 91 <div class="php8-compare__block example-contents"> 92 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 93 <div class="php8-code phpcode"> 94 <?php highlight_php_trimmed( 95 'class PostsController 96{ 97 #[Route("/api/posts/{id}", methods: ["GET"])] 98 public function get($id) { /* ... */ } 99}', 100 );?> 101 </div> 102 </div> 103 </div> 104 <div class="php8-compare__content"> 105 <p>Em vez de anotações PHPDoc, agora você pode usar metadados estruturados com a sintaxe nativa do PHP.</p> 106 </div> 107 </div> 108 109 <div class="php8-compare"> 110 <h2 class="php8-h2" id="constructor-property-promotion"> 111 Promoção de propriedade de construtor 112 <a class="php8-rfc" href="https://wiki.php.net/rfc/constructor_promotion">RFC</a> <a class="php8-rfc" href="/manual/pt_BR/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>Menos código boilerplate para definir e inicializar propriedades.</p> 155 </div> 156 </div> 157 158 <div class="php8-compare"> 159 <h2 class="php8-h2" id="union-types"> 160 União de tipos 161 <a class="php8-rfc" href="https://wiki.php.net/rfc/union_types_v2">RFC</a> <a class="php8-rfc" href="/manual/pt_BR/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>Em vez de anotações PHPDoc para uma combinação de tipos, você pode usar declarações de união de tipos nativa 202 que são validados em tempo de execução.</p> 203 </div> 204 </div> 205 206 <div class="php8-compare"> 207 <h2 class="php8-h2" id="match-expression"> 208 Expressão match 209 <a class="php8-rfc" href="https://wiki.php.net/rfc/match_expression_v2">RFC</a> <a class="php8-rfc" href="/manual/pt_BR/control-structures.match.php">Doc</a> 210 </h2> 211 <div class="php8-compare__main"> 212 <div class="php8-compare__block example-contents"> 213 <div class="php8-compare__label">PHP 7</div> 214 <div class="php8-code phpcode"> 215 <?php highlight_php_trimmed( 216 'switch (8.0) { 217 case \'8.0\': 218 $result = "Oh no!"; 219 break; 220 case 8.0: 221 $result = "This is what I expected"; 222 break; 223} 224echo $result; 225//> Oh no!', 226 );?> 227 </div> 228 </div> 229 <div class="php8-compare__arrow"></div> 230 <div class="php8-compare__block example-contents"> 231 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 232 <div class="php8-code phpcode"> 233 <?php highlight_php_trimmed( 234 'echo match (8.0) { 235 \'8.0\' => "Oh no!", 236 8.0 => "This is what I expected", 237}; 238//> This is what I expected', 239 );?> 240 </div> 241 </div> 242 </div> 243 <div class="php8-compare__content"> 244 <p>A nova expressão match é semelhante ao switch e tem os seguintes recursos:</p> 245 <ul> 246 <li>Match é uma expressão, o que significa que seu resultado pode ser armazenado em uma variável ou 247 retornado.</li> 248 <li>Match suporta apenas expressões de uma linha e não precisa de uma declaração break;.</li> 249 <li>Match faz comparações estritas.</li> 250 </ul> 251 </div> 252 </div> 253 254 <div class="php8-compare"> 255 <h2 class="php8-h2" id="nullsafe-operator"> 256 Operador nullsafe 257 <a class="php8-rfc" href="https://wiki.php.net/rfc/nullsafe_operator">RFC</a> 258 </h2> 259 <div class="php8-compare__main"> 260 <div class="php8-compare__block example-contents"> 261 <div class="php8-compare__label">PHP 7</div> 262 <div class="php8-code phpcode"> 263 <?php highlight_php_trimmed( 264 '$country = null; 265 266if ($session !== null) { 267 $user = $session->user; 268 269 if ($user !== null) { 270 $address = $user->getAddress(); 271 272 if ($address !== null) { 273 $country = $address->country; 274 } 275 } 276}', 277 );?> 278 </div> 279 </div> 280 <div class="php8-compare__arrow"></div> 281 <div class="php8-compare__block example-contents"> 282 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 283 <div class="php8-code phpcode"> 284 <?php highlight_php_trimmed( 285 '$country = $session?->user?->getAddress()?->country;', 286 );?> 287 </div> 288 </div> 289 </div> 290 <div class="php8-compare__content"> 291 <p>Em vez de verificar condições nulas, agora você pode usar uma cadeia de chamadas com o novo operador nullsafe. 292 Quando a avaliação de um elemento da cadeia falha, a execução de toda a cadeia é abortada e toda a cadeia é 293 avaliada como nula.</p> 294 </div> 295 </div> 296 297 <div class="php8-compare"> 298 <h2 class="php8-h2" id="saner-string-to-number-comparisons"> 299 Comparações mais inteligentes entre strings e números 300 <a class="php8-rfc" href="https://wiki.php.net/rfc/string_to_number_comparison">RFC</a> 301 </h2> 302 <div class="php8-compare__main"> 303 <div class="php8-compare__block example-contents"> 304 <div class="php8-compare__label">PHP 7</div> 305 <div class="php8-code phpcode"> 306 <?php highlight_php_trimmed( 307 '0 == \'foobar\' // true', 308 );?> 309 </div> 310 </div> 311 <div class="php8-compare__arrow"></div> 312 <div class="php8-compare__block example-contents"> 313 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 314 <div class="php8-code phpcode"> 315 <?php highlight_php_trimmed( 316 '0 == \'foobar\' // false', 317 );?> 318 </div> 319 </div> 320 </div> 321 <div class="php8-compare__content"> 322 <p>Ao comparar com uma string numérica, o PHP 8 usa uma comparação numérica. Caso contrário, ele converte o 323 número em uma string e usa uma comparação de string.</p> 324 </div> 325 </div> 326 327 <div class="php8-compare"> 328 <h2 class="php8-h2" id="consistent-type-errors-for-internal-functions"> 329 Erros consistentes para tipos de dados em funções internas 330 <a class="php8-rfc" href="https://wiki.php.net/rfc/consistent_type_errors">RFC</a> 331 </h2> 332 <div class="php8-compare__main"> 333 <div class="php8-compare__block example-contents"> 334 <div class="php8-compare__label">PHP 7</div> 335 <div class="php8-code phpcode"> 336 <?php highlight_php_trimmed( 337 'strlen([]); // Warning: strlen() expects parameter 1 to be string, array given 338 339array_chunk([], -1); // Warning: array_chunk(): Size parameter expected to be greater than 0', 340 );?> 341 </div> 342 </div> 343 <div class="php8-compare__arrow"></div> 344 <div class="php8-compare__block example-contents"> 345 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 346 <div class="php8-code phpcode"> 347 <?php highlight_php_trimmed( 348 'strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given 349 350array_chunk([], -1); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0', 351 );?> 352 </div> 353 </div> 354 </div> 355 <div class="php8-compare__content"> 356 <p>A maioria das funções internas agora lançam uma exceção Error se a validação do parâmetro falhar.</p> 357 </div> 358 </div> 359 </section> 360 361 <section class="php8-section php8-section_light"> 362 <h2 class="php8-h2">Compilação Just-In-Time</h2> 363 <p> 364 PHP 8 apresenta dois motores de compilação JIT. Tracing JIT, o mais promissor dos dois, mostra desempenho cerca de 365 3 vezes melhor em benchmarks sintéticos e melhoria de 1,5 a 2 vezes em alguns aplicativos específicos de longa 366 execução. O desempenho típico das aplicações está no mesmo nível do PHP 7.4. 367 </p> 368 <h3 class="php8-h3"> 369 Relative JIT contribution to PHP 8 performance 370 </h3> 371 <p> 372 <img src="/images/php8/scheme.svg" width="900" alt="Just-In-Time compilation"> 373 </p> 374 375 <div class="php8-columns"> 376 <div class="php8-column"> 377 <h2 class="php8-h2 php8-h2_margin-top">Melhorias no sistema de tipo e tratamento de erros</h2> 378 <ul> 379 <li> 380 Verificações de tipo mais rígidas para operadores aritméticos / bit a bit 381 <a href="https://wiki.php.net/rfc/arithmetic_operator_type_checks">RFC</a> 382 </li> 383 <li> 384 Validação de método abstrato em traits 385 <a href="https://wiki.php.net/rfc/abstract_trait_method_validation">RFC</a> 386 </li> 387 <li> 388 Assinaturas corretas de métodos mágicos <a href="https://wiki.php.net/rfc/magic-methods-signature">RFC</a> 389 </li> 390 <li> 391 Avisos de motor reclassificados <a href="https://wiki.php.net/rfc/engine_warnings">RFC</a> 392 </li> 393 <li> 394 Erro fatal para assinaturas de método incompatíveis <a href="https://wiki.php.net/rfc/lsp_errors">RFC</a> 395 </li> 396 <li> 397 O operador @ não silencia mais os erros fatais. 398 </li> 399 <li> 400 Herança com métodos privados <a href="https://wiki.php.net/rfc/inheritance_private_methods">RFC</a> 401 </li> 402 <li> 403 Tipo mixed <a href="https://wiki.php.net/rfc/mixed_type_v2">RFC</a> 404 </li> 405 <li> 406 Tipo de retorno static <a href="">RFC</a> 407 </li> 408 <li> 409 Tipagem de funções internas 410 <a href="https://externals.io/message/106522">Discussão por email</a> 411 </li> 412 <li> 413 Objetos opacos em vez de recursos para 414 <a href="https://php.watch/versions/8.0/resource-CurlHandle">Curl</a>, 415 <a href="https://php.watch/versions/8.0/gdimage">Gd</a>, 416 <a href="https://php.watch/versions/8.0/sockets-sockets-addressinfo">Sockets</a>, 417 <a href="https://php.watch/versions/8.0/OpenSSL-resource">OpenSSL</a>, 418 <a href="https://php.watch/versions/8.0/xmlwriter-resource">XMLWriter</a>, e 419 <a href="https://php.watch/versions/8.0/xmlwriter-resource">XML</a> 420 extensões 421 </li> 422 </ul> 423 </div> 424 <div class="php8-column"> 425 <h2 class="php8-h2 php8-h2_margin-top">Outros ajustes e melhorias de sintaxe</h2> 426 <ul> 427 <li> 428 Permitir vírgula no final da lista de parâmetros 429 <a href="https://wiki.php.net/rfc/trailing_comma_in_parameter_list">RFC</a> e listas de uso em closures 430 <a href="https://wiki.php.net/rfc/trailing_comma_in_closure_use_list">RFC</a> 431 </li> 432 <li> 433 Catches sem variável na captura de exceção <a href="https://wiki.php.net/rfc/non-capturing_catches">RFC</a> 434 </li> 435 <li> 436 Ajustes de sintaxe para variáveis <a href="https://wiki.php.net/rfc/variable_syntax_tweaks">RFC</a> 437 </li> 438 <li> 439 Tratamento de nomes de namespace como token único 440 <a href="https://wiki.php.net/rfc/namespaced_names_as_token">RFC</a> 441 </li> 442 <li> 443 Throw como expressão <a href="https://wiki.php.net/rfc/throw_expression">RFC</a> 444 </li> 445 <li> 446 Permitir ::class em objetos <a href="https://wiki.php.net/rfc/class_name_literal_on_object">RFC</a> 447 </li> 448 </ul> 449 450 <h2 class="php8-h2 php8-h2_margin-top">Novas classes, interfaces e funções</h2> 451 <ul> 452 <li> 453 Classe <a href="https://wiki.php.net/rfc/weak_maps">Weak Map</a> 454 </li> 455 <li> 456 Interface <a href="https://wiki.php.net/rfc/stringable">Stringable</a> 457 </li> 458 <li> 459 <a href="https://wiki.php.net/rfc/str_contains">str_contains()</a>, 460 <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_starts_with()</a>, 461 <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_ends_with()</a> 462 </li> 463 <li> 464 <a href="https://github.com/php/php-src/pull/4769">fdiv()</a> 465 </li> 466 <li> 467 <a href="https://wiki.php.net/rfc/get_debug_type">get_debug_type()</a> 468 </li> 469 <li> 470 <a href="https://github.com/php/php-src/pull/5427">get_resource_id()</a> 471 </li> 472 <li> 473 <a href="https://wiki.php.net/rfc/token_as_object">token_get_all()</a> implementado com objetos 474 </li> 475 <li> 476 <a href="https://wiki.php.net/rfc/dom_living_standard_api">New DOM Traversal and Manipulation APIs</a> 477 </li> 478 </ul> 479 </div> 480 </div> 481 </section> 482 483 <section class="php8-section php8-section_dark php8-section_footer php8-footer"> 484 <div class="php8-section__content"> 485 <h2 class="php8-h2 center"> 486 Obtenha melhoria de desempenho gratuita.<br class="display-none-lg display-block-md"> 487 Obtenha melhor sintaxe.<br class="display-block-lg display-none-md display-block-sm"> 488 Obtenha mais segurança de tipos. 489 </h2> 490 <div class="php8-button-wrapper center"> 491 <a class="php8-button php8-button_light" href="/downloads">Atualize para o PHP 8!</a> 492 </div> 493 <div class="php8-footer__content"> 494 <p> 495 Para downloads do código-fonte do PHP 8, visite a página de 496 <a href="http://www.php.net/downloads">downloads</a>. 497 Os binários do Windows podem ser encontrados na página <a href="http://windows.php.net/download">PHP para 498 Windows</a>. 499 A lista de mudanças é registrada no <a href="http://www.php.net/ChangeLog-8.php">ChangeLog</a>. 500 </p> 501 <p> 502 O <a href="/manual/pt_BR/migration80.php">guia de migração</a> está disponível no Manual do PHP. 503 Consulte-o para obter uma lista detalhada de novos recursos e alterações incompatíveis com versões anteriores. 504 </p> 505 </div> 506 </div> 507 </section> 508 509 510 511 512<?php site_footer(); 513