1<?php 2$_SERVER['BASE_PAGE'] = 'releases/8.0/es.php'; 3include_once __DIR__ . '/common.php'; 4 5releases\php80\common_header( 6 'PHP 8.0 es una actualización importante del lenguaje php que contiene nuevos recursos y optimizaciones incluyendo ' . 7 'argumentos nombrados, tipos de uniones, atributos, promoción de propiedades constructivas, expresiones de equivalencia, ' . 8 'operador nullsafe, JIT (traducción dinámica) y también mejoras en el sistema de tipos, manejo de errores y consistencia en general.'); 9 10?> 11<section class="php8-section php8-section_dark php8-section_header center"> 12 <div class="page-tools"> 13 <div class="change-language"> 14 <?php releases\php80\language_chooser('es'); ?> 15 </div> 16 </div> 17 <div class="php8-section__content"> 18 <div class="php8-logo"> 19 <img src="/images/php8/logo_php8.svg" alt="php8" height="126" width="343"> 20 </div> 21 <div class="php8-title">Released!</div> 22 <div class="php8-subtitle"> 23 PHP 8.0 es una actualización importante del lenguaje PHP que contiene nuevos recursos y optimizaciones 24 incluyendo argumentos nombrados, tipos de uniones, atributos, promoción de propiedades constructivas, 25 expresiones match, operador nullsafe, JIT (traducción dinámica) y también mejoras en el sistema de tipos, 26 manejo de errores y consistencia en general. 27 </div> 28 <div class="php8-button-wrapper center"> 29 <a class="php8-button php8-button_light" href="/downloads">Actualizate a PHP 8!</a> 30 </div> 31 </div> 32</section> 33 34<section class="php8-section center"> 35 <div class="php8-compare"> 36 <h2 class="php8-h2" id="named-arguments"> 37 Argumentos nombrados 38 <a class="php8-rfc" href="https://wiki.php.net/rfc/named_params">RFC</a> 39 </h2> 40 <div class="php8-compare__main"> 41 <div class="php8-compare__block example-contents"> 42 <div class="php8-compare__label">PHP 7</div> 43 <div class="php8-code phpcode"> 44 <?php highlight_php_trimmed( 45 'htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, \'UTF-8\', false);', 46 );?> 47 </div> 48 49 50 </div> 51 <div class="php8-compare__arrow"></div> 52 <div class="php8-compare__block example-contents"> 53 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 54 <div class="php8-code phpcode"> 55 <?php highlight_php_trimmed( 56 'htmlspecialchars($string, double_encode: false);', 57 );?> 58 </div> 59 </div> 60 </div> 61 <div class="php8-compare__content"> 62 <ul> 63 <li>Solamente especifica los parámetros requeridos, omite los opcionales.</li> 64 <li>Los argumentos son independientes del orden y se documentan automáticamente.</li> 65 </ul> 66 </div> 67 </div> 68 69 <div class="php8-compare"> 70 <h2 class="php8-h2" id="attributes"> 71 Atributos 72 <a class="php8-rfc" href="https://wiki.php.net/rfc/attributes_v2">RFC</a> <a class="php8-rfc" href="/manual/es/language.attributes.php">Doc</a> 73 </h2> 74 <div class="php8-compare__main"> 75 <div class="php8-compare__block example-contents"> 76 <div class="php8-compare__label">PHP 7</div> 77 <div class="php8-code phpcode"> 78 <?php highlight_php_trimmed( 79 'class PostsController 80{ 81 /** 82 * @Route("/api/posts/{id}", methods={"GET"}) 83 */ 84 public function get($id) { /* ... */ } 85}', 86 );?> 87 </div> 88 </div> 89 <div class="php8-compare__arrow"></div> 90 <div class="php8-compare__block example-contents"> 91 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 92 <div class="php8-code phpcode"> 93 <?php highlight_php_trimmed( 94 'class PostsController 95{ 96 #[Route("/api/posts/{id}", methods: ["GET"])] 97 public function get($id) { /* ... */ } 98}', 99 );?> 100 </div> 101 </div> 102 </div> 103 <div class="php8-compare__content"> 104 <p>En vez de anotaciones en PHPDoc, puedes usar metadatos estructurados con el sintax nativo de PHP.</p> 105 </div> 106 </div> 107 108 <div class="php8-compare"> 109 <h2 class="php8-h2" id="constructor-property-promotion"> 110 Promoción de propiedades constructivas 111 <a class="php8-rfc" href="https://wiki.php.net/rfc/constructor_promotion">RFC</a> <a class="php8-rfc" href="/manual/en/language.oop5.decon.php#language.oop5.decon.constructor.promotion">Doc</a> 112 </h2> 113 <div class="php8-compare__main"> 114 <div class="php8-compare__block example-contents"> 115 <div class="php8-compare__label">PHP 7</div> 116 <div class="php8-code phpcode"> 117 <?php highlight_php_trimmed( 118 'class Point { 119 public float $x; 120 public float $y; 121 public float $z; 122 123 public function __construct( 124 float $x = 0.0, 125 float $y = 0.0, 126 float $z = 0.0 127 ) { 128 $this->x = $x; 129 $this->y = $y; 130 $this->z = $z; 131 } 132}', 133 );?> 134 </div> 135 </div> 136 <div class="php8-compare__arrow"></div> 137 <div class="php8-compare__block example-contents"> 138 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 139 <div class="php8-code phpcode"> 140 <?php highlight_php_trimmed( 141 'class Point { 142 public function __construct( 143 public float $x = 0.0, 144 public float $y = 0.0, 145 public float $z = 0.0, 146 ) {} 147}', 148 );?> 149 </div> 150 </div> 151 </div> 152 <div class="php8-compare__content"> 153 <p>Menos código repetitivo para definir e inicializar una propiedad.</p> 154 </div> 155 </div> 156 157 <div class="php8-compare"> 158 <h2 class="php8-h2" id="union-types"> 159 Tipos de unión 160 <a class="php8-rfc" href="https://wiki.php.net/rfc/union_types_v2">RFC</a> 161 <a class="php8-rfc" href="/manual/en/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>En vez de anotaciones en PHPDoc para combinar tipos, puedes usar una declaración de tipo unión nativa que será validada en el momento de ejecución.</p> 202 </div> 203 </div> 204 205 <div class="php8-compare"> 206 <h2 class="php8-h2" id="match-expression"> 207 Expresiones match 208 <a class="php8-rfc" href="https://wiki.php.net/rfc/match_expression_v2">RFC</a> <a class="php8-rfc" href="/manual/en/control-structures.match.php">Doc</a> 209 </h2> 210 <div class="php8-compare__main"> 211 <div class="php8-compare__block example-contents"> 212 <div class="php8-compare__label">PHP 7</div> 213 <div class="php8-code phpcode"> 214 <?php highlight_php_trimmed( 215 'switch (8.0) { 216 case \'8.0\': 217 $result = "Oh no!"; 218 break; 219 case 8.0: 220 $result = "This is what I expected"; 221 break; 222} 223echo $result; 224//> Oh no!', 225 );?> 226 </div> 227 </div> 228 <div class="php8-compare__arrow"></div> 229 <div class="php8-compare__block example-contents"> 230 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 231 <div class="php8-code phpcode"> 232 <?php highlight_php_trimmed( 233 'echo match (8.0) { 234 \'8.0\' => "Oh no!", 235 8.0 => "This is what I expected", 236}; 237//> This is what I expected', 238 );?> 239 </div> 240 </div> 241 </div> 242 <div class="php8-compare__content"> 243 244 <p>Las nuevas expresiones match son similares a switch y tienen las siguientes características: </p> 245 <ul> 246 <li>Match es una expresión; esto quiere decir que pueden ser almacenadas como variables o devueltas.</li> 247 <li>Match soporta expresiones de una línea y no necesitan romper declarar un break.</li> 248 <li>Match hace comparaciones estrictas.</li> 249 </ul> 250 </div> 251 </div> 252 253 <div class="php8-compare"> 254 <h2 class="php8-h2" id="nullsafe-operator"> 255 Operador Nullsafe 256 <a class="php8-rfc" href="https://wiki.php.net/rfc/nullsafe_operator">RFC</a> 257 </h2> 258 <div class="php8-compare__main"> 259 <div class="php8-compare__block example-contents"> 260 <div class="php8-compare__label">PHP 7</div> 261 <div class="php8-code phpcode"> 262 <?php highlight_php_trimmed( 263 '$country = null; 264 265if ($session !== null) { 266 $user = $session->user; 267 268 if ($user !== null) { 269 $address = $user->getAddress(); 270 271 if ($address !== null) { 272 $country = $address->country; 273 } 274 } 275}', 276 );?> 277 </div> 278 </div> 279 <div class="php8-compare__arrow"></div> 280 <div class="php8-compare__block example-contents"> 281 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 282 <div class="php8-code phpcode"> 283 <?php highlight_php_trimmed( 284 '$country = $session?->user?->getAddress()?->country;', 285 );?> 286 </div> 287 </div> 288 </div> 289 <div class="php8-compare__content"> 290 <p>En vez de verificar condiciones nulas, tu puedes utilizar una cadena de llamadas con el nuevo operador nullsafe. 291 Cuando la evaluación de un elemento falla, la ejecución de la entire cadena es abortada y la cadena entera es evaluada como nula.</p> 292 </div> 293 </div> 294 295 <div class="php8-compare"> 296 <h2 class="php8-h2" id="saner-string-to-number-comparisons"> 297 Comparaciones inteligentes entre “strings” y números 298 <a class="php8-rfc" href="https://wiki.php.net/rfc/string_to_number_comparison">RFC</a> 299 </h2> 300 <div class="php8-compare__main"> 301 <div class="php8-compare__block example-contents"> 302 <div class="php8-compare__label">PHP 7</div> 303 <div class="php8-code phpcode"> 304 <?php highlight_php_trimmed( 305 '0 == \'foobar\' // true', 306 );?> 307 </div> 308 </div> 309 <div class="php8-compare__arrow"></div> 310 <div class="php8-compare__block example-contents"> 311 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 312 <div class="php8-code phpcode"> 313 <?php highlight_php_trimmed( 314 '0 == \'foobar\' // false', 315 );?> 316 </div> 317 </div> 318 </div> 319 <div class="php8-compare__content"> 320 <p> Cuando comparas con un “string” numérico, PHP8 usa comparación numérica o de otro caso convierte el número a 321 un "string" y asi los compara.</p> 322 </div> 323 </div> 324 325 <div class="php8-compare"> 326 <h2 class="php8-h2" id="consistent-type-errors-for-internal-functions"> 327 Errores consistentes para funciones internas. 328 <a class="php8-rfc" href="https://wiki.php.net/rfc/consistent_type_errors">RFC</a> 329 </h2> 330 <div class="php8-compare__main"> 331 <div class="php8-compare__block example-contents"> 332 <div class="php8-compare__label">PHP 7</div> 333 <div class="php8-code phpcode"> 334 <?php highlight_php_trimmed( 335 'strlen([]); // Warning: strlen() expects parameter 1 to be string, array given 336 337array_chunk([], -1); // Warning: array_chunk(): Size parameter expected to be greater than 0', 338 );?> 339 </div> 340 </div> 341 <div class="php8-compare__arrow"></div> 342 <div class="php8-compare__block example-contents"> 343 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 344 <div class="php8-code phpcode"> 345 <?php highlight_php_trimmed( 346 'strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given 347 348array_chunk([], -1); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0', 349 );?> 350 </div> 351 </div> 352 </div> 353 <div class="php8-compare__content"> 354 <p>La mayoría de las funciones internas ahora proveen un error de excepción si el parámetro no es validado.</p> 355 </div> 356 </div> 357</section> 358 359<section class="php8-section php8-section_light"> 360 <h2 class="php8-h2">JIT (traducciones dinámicas)</h2> 361 <p> 362 PHP8 introduce 2 motores de compilación JIT. Transit JIT, es el más prometedor de los dos y performa 3 veces mejor 363 en benchmarks sintéticos y 1.5-2 mejor en algunas aplicaciones específicas a largo plazo. Performancia de aplicaciones 364 típicas es a la par de las de PHP7.4 365 </p> 366 <h3 class="php8-h3"> 367 JIT contribuciones al funcionamiento relativo de PHP8 368 </h3> 369 <p> 370 <img src="/images/php8/scheme.svg" width="900" alt="Just-In-Time compilation"> 371 </p> 372 373 <div class="php8-columns"> 374 <div class="php8-column"> 375 <h2 class="php8-h2 php8-h2_margin-top">Mejorias en los tipos de sistemas y manejo de errores</h2> 376 <ul> 377 <li> 378 Verificaciones estrictas de operadores aritméticos/bitwise. 379 <a href="https://wiki.php.net/rfc/arithmetic_operator_type_checks">RFC</a> 380 </li> 381 <li> 382 Validación de métodos con características abstractas <a href="https://wiki.php.net/rfc/abstract_trait_method_validation">RFC</a> 383 </li> 384 <li> 385 Firmas correctas de métodos mágicos <a href="https://wiki.php.net/rfc/magic-methods-signature">RFC</a> 386 </li> 387 <li> 388 Reclacificamiento de errores fatales <a href="https://wiki.php.net/rfc/engine_warnings">RFC</a> 389 </li> 390 <li> 391 Errores fatales incompatibles con el método de firma <a href="https://wiki.php.net/rfc/lsp_errors">RFC</a> 392 </li> 393 <li> 394 El operador @ no omitirá errores fatales. 395 </li> 396 <li> 397 Herencia con métodos privados <a href="https://wiki.php.net/rfc/inheritance_private_methods">RFC</a> 398 </li> 399 <li> 400 Tipos mixtos <a href="https://wiki.php.net/rfc/mixed_type_v2">RFC</a> 401 </li> 402 <li> 403 Tipo retorno statico <a href="https://wiki.php.net/rfc/static_return_type">RFC</a> 404 </li> 405 <li> 406 Tipos para funciones internas 407 <a href="https://externals.io/message/106522">Email thread</a> 408 </li> 409 <li> 410 Objetos opacos en ves de recursos para 411 <a href="https://php.watch/versions/8.0/resource-CurlHandle">Curl</a>, 412 <a href="https://php.watch/versions/8.0/gdimage">Gd</a>, 413 <a href="https://php.watch/versions/8.0/sockets-sockets-addressinfo">Sockets</a>, 414 <a href="https://php.watch/versions/8.0/OpenSSL-resource">OpenSSL</a>, 415 <a href="https://php.watch/versions/8.0/xmlwriter-resource">XMLWriter</a>, 416 y <a href="https://php.watch/versions/8.0/xmlwriter-resource">XML</a> extensiones 417 </li> 418 </ul> 419 </div> 420 <div class="php8-column"> 421 <h2 class="php8-h2 php8-h2_margin-top">Otros ajustes y mejoras del sintax</h2> 422 <ul> 423 <li> 424 Permitir una coma al final de una lista de parámetros <a href="https://wiki.php.net/rfc/trailing_comma_in_parameter_list">RFC</a> 425 y lista de use en closures <a href="https://wiki.php.net/rfc/trailing_comma_in_closure_use_list">RFC</a> 426 </li> 427 <li> 428 Catches que no capturan <a href="https://wiki.php.net/rfc/non-capturing_catches">RFC</a> 429 </li> 430 <li> 431 Ajustes al syntax variable <a href="https://wiki.php.net/rfc/variable_syntax_tweaks">RFC</a> 432 </li> 433 <li> 434 Tratamiento de nombres de namespace como tokens únicos<a href="https://wiki.php.net/rfc/namespaced_names_as_token">RFC</a> 435 </li> 436 <li> 437 Throw es ahora una expresión <a href="https://wiki.php.net/rfc/throw_expression">RFC</a> 438 </li> 439 <li> 440 Permitir ::class on objects <a href="https://wiki.php.net/rfc/class_name_literal_on_object">RFC</a> 441 </li> 442 </ul> 443 444 <h2 class="php8-h2 php8-h2_margin-top">Nuevas clases, interfaces y funciones</h2> 445 <ul> 446 <li> 447 <a href="https://wiki.php.net/rfc/weak_maps">Weak Map</a> clase 448 </li> 449 <li> 450 <a href="https://wiki.php.net/rfc/stringable">Stringable</a> interface 451 </li> 452 <li> 453 <a href="https://wiki.php.net/rfc/str_contains">str_contains()</a>, 454 <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_starts_with()</a>, 455 <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_ends_with()</a> 456 </li> 457 <li> 458 <a href="https://github.com/php/php-src/pull/4769">fdiv()</a> 459 </li> 460 <li> 461 <a href="https://wiki.php.net/rfc/get_debug_type">get_debug_type()</a> 462 </li> 463 <li> 464 <a href="https://github.com/php/php-src/pull/5427">get_resource_id()</a> 465 </li> 466 <li> 467 <a href="https://wiki.php.net/rfc/token_as_object">token_get_all()</a> Implementación de objeto 468 </li> 469 <li> 470 <a href="https://wiki.php.net/rfc/dom_living_standard_api">New DOM Traversal and Manipulation APIs</a> 471 </li> 472 </ul> 473 </div> 474 </div> 475</section> 476 477<section class="php8-section php8-section_dark php8-section_footer php8-footer"> 478 <div class="php8-section__content"> 479 <h2 class="php8-h2 center"> 480 Mejor performancia, mejor syntax, aumentada seguridad de tipos. 481 </h2> 482 <div class="php8-button-wrapper center"> 483 <a class="php8-button php8-button_light" href="/downloads">Actualizate a PHP8!</a> 484 </div> 485 <div class="php8-footer__content"> 486 <p> 487 Para bajar el código fuente de PHP8 visita la página <a href="http://www.php.net/downloads">downloads</a>. 488 Código binario para windows lo puedes encontrar en la página <a href="http://windows.php.net/download">PHP for Windows</a>. 489 La lista de cambios está disponible en la página <a href="http://www.php.net/ChangeLog-8.php">ChangeLog</a>. 490 </p> 491 <p> 492 La <a href="/manual/en/migration80.php">guía de migración</a> está disponible en el manual de PHP. 493 Por favor consultala para una lista detallada de alteraciones cambios y compatibilidad. 494 </p> 495 </div> 496 </div> 497</section> 498 499<?php site_footer(); 500