1
0
mirror of https://github.com/php/doc-es.git synced 2026-03-23 23:12:09 +01:00
Files
archived-doc-es/appendices/migration80/new-features.xml
2026-03-03 11:55:31 +01:00

641 lines
22 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 497c40ac164d5873fd87f622dfdeb5206392b446 Maintainer: julionc Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="migration80.new-features" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Nuevas características</title>
<sect2 xml:id="migration80.new-features.core">
<title>Núcleo de PHP</title>
<sect3 xml:id="migration80.new-features.core.named-arguments">
<title>Argumentos nombrados</title>
<para>
<!-- RFC: https://wiki.php.net/rfc/named_params -->
Se ha añadido soporte para los<link linkend="functions.named-arguments">Argumentos nombrados</link>.
</para>
</sect3>
<sect3 xml:id="migration80.new-features.core.attributes">
<title>Atributos</title>
<para>
Se ha añadido soporte para los <link linkend="language.attributes">Atributos</link>.
<!-- RFC: https://wiki.php.net/rfc/attributes_v2 -->
<!-- RFC: https://wiki.php.net/rfc/attribute_amendments -->
<!-- RFC: https://wiki.php.net/rfc/shorter_attribute_syntax -->
<!-- RFC: https://wiki.php.net/rfc/shorter_attribute_syntax_change -->
</para>
</sect3>
<sect3 xml:id="migration80.new-features.core.property-promotion">
<title>Promoción de propiedades en el constructor</title>
<para>
Se ha añadido soporte para la <link linkend="language.oop5.decon.constructor.promotion">promoción de propiedades en el constructor</link> (declarar propiedades en la firma del constructor).
<!-- RFC: https://wiki.php.net/rfc/constructor_promotion -->
</para>
</sect3>
<sect3 xml:id="migration80.new-features.core.union-types">
<title>Tipos de unión</title>
<para>
Se ha añadido soporte para los <link linkend="language.types.declarations.composite.union">tipos de unión</link>.
<!-- RFC: https://wiki.php.net/rfc/union_types_v2 -->
</para>
</sect3>
<sect3 xml:id="migration80.new-features.core.match">
<title>Expresión match</title>
<para>
Se ha añadido soporte para las <link linkend="control-structures.match">expresiones <literal>match</literal></link>.
<!-- RFC: https://wiki.php.net/rfc/match_expression_v2 -->
</para>
</sect3>
<sect3 xml:id="migration80.new-features.core.nullsafe-operator">
<title>Operador nullsafe</title>
<para>
Se ha añadido soporte para el <link linkend="language.oop5.basic.nullsafe">operador nullsafe</link> (<literal>?-></literal>).
<!-- RFC: https://wiki.php.net/rfc/nullsafe_operator -->
</para>
</sect3>
<sect3 xml:id="migration80.new-features.core.others">
<title>Otras nuevas características</title>
<itemizedlist>
<listitem>
<para>
<!-- we cannot use <classname>WeakMap</classname> because that would link to the wrong class -->
Se ha añadido la clase <literal>WeakMap</literal>.
<!-- RFC: https://wiki.php.net/rfc/weak_maps -->
</para>
</listitem>
<listitem>
<para>
Se ha añadido la clase <classname>ValueError</classname>.
</para>
</listitem>
<listitem>
<para>
Cualquier número de parámetros de función ahora puede ser reemplazado por un argumento variádico, siempre que los
tipos sean compatibles. Por ejemplo, el siguiente código ahora está permitido:
</para>
<para>
<programlisting role="php">
<![CDATA[
<?php
class A {
public function method(int $many, string $parameters, $here) {}
}
class B extends A {
public function method(...$everything) {}
}
?>
]]>
</programlisting>
</para>
</listitem>
<listitem>
<para>
<type>static</type> (como en "enlace estático en tiempo de ejecución") ahora puede ser usado como tipo de retorno:
</para>
<para>
<programlisting role="php">
<![CDATA[
<?php
class Test {
public function create(): static {
return new static();
}
}
?>
]]>
</programlisting>
<!-- RFC: https://wiki.php.net/rfc/static_return_type -->
</para>
</listitem>
<listitem>
<para>
Ahora es posible obtener el nombre de la clase de un objeto usando
<code>$object::class</code>. El resultado es el mismo que <code>get_class($object)</code>.
<!-- RFC: https://wiki.php.net/rfc/class_name_literal_on_object -->
</para>
</listitem>
<listitem>
<para>
&new; e &instanceof; ahora pueden ser usados con expresiones arbitrarias,
usando <code>new (expression)(...$args)</code> y <code>$obj instanceof (expression)</code>.
<!-- RFC: https://wiki.php.net/rfc/variable_syntax_tweaks -->
</para>
</listitem>
<listitem>
<para>
Se han aplicado algunas correcciones de consistencia en la sintaxis de variables, por ejemplo, escribir
<code>Foo::BAR::$baz</code> ahora está permitido.
<!-- RFC: https://wiki.php.net/rfc/variable_syntax_tweaks -->
</para>
</listitem>
<listitem>
<para>
Se ha añadido la interfaz <interfacename>Stringable</interfacename>, que se implementa automáticamente si
una clase define un método <link linkend="object.tostring">__toString()</link>.
<!-- RFC: https://wiki.php.net/rfc/stringable -->
</para>
</listitem>
<listitem>
<para>
Los traits ahora pueden definir métodos privados abstractos.
Dichos métodos deben ser implementados por la clase que usa el trait.
<!-- RFC: https://wiki.php.net/rfc/abstract_trait_method_validation -->
</para>
</listitem>
<listitem>
<para>
<literal>throw</literal> ahora puede ser usado como una expresión.
Esto permite usos como:
<programlisting role="php">
<![CDATA[
<?php
$fn = fn() => throw new Exception('Exception in arrow function');
$user = $session->user ?? throw new Exception('Must have user');
]]>
</programlisting>
<!-- RFC: https://wiki.php.net/rfc/throw_expression -->
</para>
</listitem>
<listitem>
<para>
Ahora se permite una coma final opcional en las listas de parámetros.
<programlisting role="php">
<![CDATA[
<?php
function functionWithLongSignature(
Type1 $parameter1,
Type2 $parameter2, // <-- This comma is now allowed.
) {
}
]]>
</programlisting>
<!-- RFC: https://wiki.php.net/rfc/trailing_comma_in_parameter_list -->
</para>
</listitem>
<listitem>
<para>
Ahora es posible escribir <code>catch (Exception)</code> para capturar una excepción sin almacenarla
en una variable.
<!-- RFC: https://wiki.php.net/rfc/non-capturing_catches -->
</para>
</listitem>
<listitem>
<para>
Se ha añadido soporte para el tipo <type>mixed</type>.
<!-- RFC: https://wiki.php.net/rfc/mixed_type_v2 -->
</para>
</listitem>
<listitem>
<para>
Los métodos privados declarados en una clase padre ya no imponen ninguna regla de herencia sobre los métodos
de una clase hija (con la excepción de los constructores privados finales).
El siguiente ejemplo ilustra qué restricciones han sido eliminadas:
<programlisting role="php">
<![CDATA[
<?php
class ParentClass {
private function method1() {}
private function method2() {}
private static function method3() {}
// Throws a warning, as "final" no longer has an effect:
private final function method4() {}
}
class ChildClass extends ParentClass {
// All of the following are now allowed, even though the modifiers aren't
// the same as for the private methods in the parent class.
public abstract function method1() {}
public static function method2() {}
public function method3() {}
public function method4() {}
}
?>
]]>
</programlisting>
<!-- RFC: https://wiki.php.net/rfc/inheritance_private_methods -->
</para>
</listitem>
<listitem>
<para>
Se ha añadido <function>get_resource_id</function>, que devuelve el mismo valor que
<code>(int) $resource</code>. Proporciona la misma funcionalidad con una API más clara.
</para>
</listitem>
</itemizedlist>
</sect3>
</sect2>
<sect2 xml:id="migration80.new-features.date">
<title>Fecha y hora</title>
<itemizedlist>
<listitem>
<para>
Se han añadido <methodname>DateTime::createFromInterface</methodname> y
<methodname>DateTimeImmutable::createFromInterface</methodname>.
</para>
</listitem>
<listitem>
<para>
Se ha añadido el especificador de formato DateTime <literal>p</literal>, que es igual que
<literal>P</literal> pero devuelve <literal>Z</literal> en lugar de <literal>+00:00</literal>
para UTC.
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration80.new-features.dom">
<title>DOM</title>
<para>
Se han añadido <interfacename>DOMParentNode</interfacename> y <interfacename>DOMChildNode</interfacename> con
nuevas API de recorrido y manipulación.
<!-- RFC: https://wiki.php.net/rfc/dom_living_standard_api-->
</para>
</sect2>
<sect2 xml:id="migration80.new-features.filter">
<title>Filter</title>
<para>
Se ha añadido <constant>FILTER_VALIDATE_BOOL</constant> como alias de
<constant>FILTER_VALIDATE_BOOLEAN</constant>. Se prefiere el nuevo nombre, ya que utiliza el nombre
de tipo canónico.
</para>
</sect2>
<sect2 xml:id="migration80.new-features.enchant">
<title>Enchant</title>
<para>
Se han añadido <function>enchant_dict_add</function>, <function>enchant_dict_is_added</function> y
<constant>LIBENCHANT_VERSION</constant>.
</para>
</sect2>
<sect2 xml:id="migration80.new-features.fpm">
<title>FPM</title>
<para>
Se ha añadido una nueva opción <literal>pm.status_listen</literal> que permite obtener el estado desde
un endpoint diferente (por ejemplo, un puerto o archivo UDS), lo cual es útil para obtener el estado cuando todos
los procesos hijos están ocupados sirviendo peticiones de larga duración.
</para>
</sect2>
<sect2 xml:id="migration80.new-features.hash">
<title>Hash</title>
<para>
Los objetos <classname>HashContext</classname> ahora pueden ser serializados.
</para>
</sect2>
<sect2 xml:id="migration80.new-features.intl">
<title>Funciones de internacionalización</title>
<para>
Se han añadido las constantes <constant>IntlDateFormatter::RELATIVE_FULL</constant>,
<constant>IntlDateFormatter::RELATIVE_LONG</constant>,
<constant>IntlDateFormatter::RELATIVE_MEDIUM</constant> y
<constant>IntlDateFormatter::RELATIVE_SHORT</constant>.
</para>
</sect2>
<sect2 xml:id="migration80.new-features.ldap">
<title>LDAP</title>
<para>
Se ha añadido <function>ldap_count_references</function>, que devuelve el número
de mensajes de referencia en un resultado de búsqueda.
</para>
</sect2>
<sect2 xml:id="migration80.new-features.opcache">
<title>OPcache</title>
<para>
Si la directiva ini <!--<link linkend="ini.opcache.record-warnings">-->opcache.record_warnings<!--</link>--> está
habilitada, OPcache registrará las advertencias en tiempo de compilación y las reproducirá en el siguiente include, incluso si
se sirve desde la caché.
</para>
</sect2>
<sect2 xml:id="migration80.new-features.openssl">
<title>OpenSSL</title>
<para>
Se ha añadido soporte para Cryptographic Message Syntax (CMS) (<link xlink:href="&url.rfc;5652">RFC 5652</link>)
compuesto por funciones para cifrado, descifrado, firma, verificación y lectura. La API
es similar a la API de las funciones PKCS #7 con la adición de nuevas constantes de codificación:
<constant>OPENSSL_ENCODING_DER</constant>, <constant>OPENSSL_ENCODING_SMIME</constant>
y <constant>OPENSSL_ENCODING_PEM</constant>:
<simplelist>
<member>
<function>openssl_cms_encrypt</function> cifra el mensaje en el archivo con los certificados
y envía el resultado al archivo proporcionado.
</member>
<member>
<function>openssl_cms_decrypt</function> descifra el mensaje S/MIME en el archivo y envía
los resultados al archivo proporcionado.
</member>
<member>
<function>openssl_cms_read</function> exporta el archivo CMS a un array de certificados PEM.
</member>
<member>
<function>openssl_cms_sign</function> firma el mensaje MIME en el archivo con un certificado y una clave
y envía el resultado al archivo proporcionado.
</member>
<member>
<function>openssl_cms_verify</function> verifica que el bloque de datos está intacto, que el firmante
es quien dice ser, y devuelve los certificados de los firmantes.
</member>
</simplelist>
</para>
</sect2>
<sect2 xml:id="migration80.new-features.pcre">
<title>Expresiones regulares (compatibles con Perl)</title>
<para>
Se ha añadido <function>preg_last_error_msg</function>, que devuelve un mensaje legible para el último
error PCRE. Complementa a <function>preg_last_error</function>, que devuelve un valor entero de enumeración
en su lugar.
</para>
</sect2>
<sect2 xml:id="migration80.new-features.reflection">
<title>Reflexión</title>
<itemizedlist>
<listitem>
<para>
Los siguientes métodos ahora pueden devolver información sobre los valores predeterminados de
los parámetros de las funciones internas:
</para>
<para>
<simplelist>
<member><methodname>ReflectionParameter::isDefaultValueAvailable</methodname></member>
<member><methodname>ReflectionParameter::getDefaultValue</methodname></member>
<member><methodname>ReflectionParameter::isDefaultValueConstant</methodname></member>
<member><methodname>ReflectionParameter::getDefaultValueConstantName</methodname></member>
</simplelist>
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration80.new-features.sqlite3">
<title>SQLite3</title>
<para>
Se han añadido <methodname>SQLite3::setAuthorizer</methodname> y las constantes de clase correspondientes
para establecer una función de retorno de llamada de usuario que se utilizará para autorizar o no una acción en la base de datos.
<!-- PR: https://github.com/php/php-src/pull/4797 -->
</para>
</sect2>
<sect2 xml:id="migration80.new-features.standard">
<title>Biblioteca estándar</title>
<itemizedlist>
<listitem>
<para>
Se han añadido <function>str_contains</function>, <function>str_starts_with</function> y
<function>str_ends_with</function>, que comprueban si <parameter>haystack</parameter> contiene,
comienza con o termina con <parameter>needle</parameter>, respectivamente.
<!-- RFC: https://wiki.php.net/rfc/str_contains -->
<!-- RFC: https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions -->
</para>
</listitem>
<listitem>
<para>
Se ha añadido <function>fdiv</function>, que realiza una división de punto flotante según la semántica IEEE 754.
La división por cero se considera bien definida y devolverá uno de <literal>Inf</literal>,
<literal>-Inf</literal> o <literal>NaN</literal>.
</para>
</listitem>
<listitem>
<para>
Se ha añadido <function>get_debug_type</function>, que devuelve un tipo útil para mensajes de error. A diferencia de
<function>gettype</function>, utiliza nombres de tipo canónicos, devuelve nombres de clase para objetos e
indica el tipo de recurso para los recursos.
<!-- RFC: https://wiki.php.net/rfc/get_debug_type -->
</para>
</listitem>
<listitem>
<para>
<function>printf</function> y funciones similares ahora soportan los especificadores de formato <literal>%h</literal> y
<literal>%H</literal>. Son iguales que <literal>%g</literal> y
<literal>%G</literal>, pero siempre usan <literal>"."</literal> como separador decimal, en lugar
de determinarlo a través de la configuración regional <constant>LC_NUMERIC</constant>.
</para>
</listitem>
<listitem>
<para>
<function>printf</function> y funciones similares ahora soportan el uso de <literal>"*"</literal> como ancho o
precisión, en cuyo caso el ancho/precisión se pasa como argumento a printf. Esto también permite
usar precisión <literal>-1</literal> con <literal>%g</literal>, <literal>%G</literal>,
<literal>%h</literal> y <literal>%H</literal>. Por ejemplo, el siguiente código puede usarse para
reproducir el formato predeterminado de punto flotante de PHP:
</para>
<para>
<programlisting role="php">
<![CDATA[
<?php
printf("%.*H", (int) ini_get("precision"), $float);
printf("%.*H", (int) ini_get("serialize_precision"), $float);
?>
]]>
</programlisting>
</para>
</listitem>
<listitem>
<para>
<function>proc_open</function> ahora soporta descriptores de pseudo-terminal (PTY). Lo siguiente
conecta <literal>stdin</literal>, <literal>stdout</literal> y <literal>stderr</literal> al
mismo PTY:
</para>
<para>
<programlisting role="php">
<![CDATA[
<?php
$proc = proc_open($command, [['pty'], ['pty'], ['pty']], $pipes);
?>
]]>
</programlisting>
</para>
</listitem>
<listitem>
<para>
<function>proc_open</function> ahora soporta descriptores de pares de sockets. Lo siguiente conecta un
par de sockets distinto a <literal>stdin</literal>, <literal>stdout</literal> y
<literal>stderr</literal>:
</para>
<para>
<programlisting role="php">
<![CDATA[
<?php
$proc = proc_open($command, [['socket'], ['socket'], ['socket']], $pipes);
?>
]]>
</programlisting>
</para>
<para>
A diferencia de las tuberías, los sockets no sufren problemas de E/S bloqueante en Windows. Sin embargo, no todos
los programas pueden funcionar correctamente con sockets stdio.
</para>
</listitem>
<listitem>
<para>
Las funciones de ordenamiento ahora son estables, lo que significa que los elementos que se comparan como iguales conservarán su
orden original.
<!-- RFC: https://wiki.php.net/rfc/stable_sorting -->
</para>
</listitem>
<listitem>
<para>
<function>array_diff</function>, <function>array_intersect</function> y sus variaciones ahora pueden
ser usadas con un solo array como argumento. Esto significa que usos como los siguientes ahora son
posibles:
</para>
<para>
<programlisting role="php">
<![CDATA[
<?php
// OK even if $excludes is empty:
array_diff($array, ...$excludes);
// OK even if $arrays only contains a single array:
array_intersect(...$arrays);
?>
]]>
</programlisting>
</para>
</listitem>
<listitem>
<para>
El parámetro <parameter>flag</parameter> de <function>ob_implicit_flush</function> fue cambiado
para aceptar un <type>bool</type> en lugar de un <type>int</type>.
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration80.new-features.tokenizer">
<title>Tokenizer</title>
<para>
<classname>PhpToken</classname> añade una interfaz basada en objetos al tokenizer. Proporciona una
representación más uniforme y ergonómica, siendo al mismo tiempo más eficiente en memoria y más rápida.
<!-- RFC: https://wiki.php.net/rfc/token_as_object -->
</para>
</sect2>
<sect2 xml:id="migration80.new-features.zip">
<title>Zip</title>
<itemizedlist>
<listitem>
<para>
La extensión Zip ha sido actualizada a la versión 1.19.1.
</para>
</listitem>
<listitem>
<para>
Nuevos <methodname>ZipArchive::setMtimeName</methodname> y
<methodname>ZipArchive::setMtimeIndex</methodname> para establecer la hora de modificación de una entrada.
</para>
</listitem>
<listitem>
<para>
Nuevo <methodname>ZipArchive::registerProgressCallback</methodname> para proporcionar actualizaciones durante el cierre del archivo.
</para>
</listitem>
<listitem>
<para>
Nuevo <methodname>ZipArchive::registerCancelCallback</methodname> para permitir la cancelación durante el cierre
del archivo.
</para>
</listitem>
<listitem>
<para>
Nuevo <methodname>ZipArchive::replaceFile</methodname> para reemplazar el contenido de una entrada.
</para>
</listitem>
<listitem>
<para>
Nuevo <methodname>ZipArchive::isCompressionMethodSupported</methodname> para verificar las características opcionales de
compresión.
</para>
</listitem>
<listitem>
<para>
Nuevo <methodname>ZipArchive::isEncryptionMethodSupported</methodname> para verificar las características opcionales de
cifrado.
</para>
</listitem>
<listitem>
<para>
Se ha añadido la propiedad <varname>ZipArchive::lastId</varname> para obtener el valor del índice
de la última entrada añadida.
</para>
</listitem>
<listitem>
<para>
Ahora se pueden verificar los errores después de que un archivo ha sido cerrado usando las propiedades
<varname>ZipArchive::status</varname> y
<varname>ZipArchive::statusSys</varname>, o el método
<methodname>ZipArchive::getStatusString</methodname>.
</para>
</listitem>
<listitem>
<para>
La opción <literal>'remove_path'</literal> de <methodname>ZipArchive::addGlob</methodname> y
<methodname>ZipArchive::addPattern</methodname> ahora se trata como un prefijo de cadena arbitrario (para
mantener la consistencia con la opción <literal>'add_path'</literal>), mientras que anteriormente se trataba como un
nombre de directorio.
</para>
</listitem>
<listitem>
<para>
Las características opcionales de compresión / cifrado ahora se listan en phpinfo.
</para>
</listitem>
</itemizedlist>
</sect2>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->