xref: /web-php/releases/8.0/es.php (revision c093fb53)
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