{"id":33620,"date":"2020-05-26T03:04:44","date_gmt":"2020-05-26T10:04:44","guid":{"rendered":"https:\/\/kinsta.com\/?p=73118"},"modified":"2025-02-17T15:22:34","modified_gmt":"2025-02-17T14:22:34","slug":"php-8","status":"publish","type":"post","link":"https:\/\/kinsta.com\/es\/blog\/php-8\/","title":{"rendered":"\u00bfQu\u00e9 hay de nuevo en PHP 8? (Caracter\u00edsticas, mejoras y el Compilador JIT )"},"content":{"rendered":"<p>Se espera que PHP 8 sea lanzado en <a href=\"https:\/\/wiki.php.net\/todo\/php80\">diciembre de 2020<\/a> y nos traer\u00e1 un mont\u00f3n de caracter\u00edsticas poderosas y grandes mejoras en el lenguaje.<\/p>\n<p>Ya se han aprobado e implementado muchos RFC, as\u00ed que es hora de que nos sumerjamos en algunas de las adiciones m\u00e1s emocionantes que deber\u00edan hacer que PHP sea m\u00e1s r\u00e1pido y fiable.<\/p>\n<p>Como PHP 8 est\u00e1 todav\u00eda en desarrollo, podr\u00edamos ver varios cambios antes de la publicaci\u00f3n final. Haremos un seguimiento de estos cambios y actualizaremos este post regularmente, as\u00ed que aseg\u00farate de no perderte nada de PHP 8 y revisa este post de vez en cuando.<\/p>\n<p>Entonces, \u00bfqu\u00e9 caracter\u00edsticas y mejoras debemos esperar con PHP 8? \u00bfQu\u00e9 es lo m\u00e1s importante que viene con PHP 8, la pr\u00f3xima gran versi\u00f3n del lenguaje?<\/p>\n<p>\u00a1Vamos a sumergirnos!<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2 id=\"jit\">PHP JIT (Just in Time Compiler)<\/h2>\n<p>La caracter\u00edstica m\u00e1s destacada que viene con PHP 8 es el <strong>compilador Just-in-time (JIT)<\/strong>. \u00bfDe qu\u00e9 se trata JIT?<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/jit\">La propuesta de la RFC<\/a>\u00a0describe el JIT de la siguiente manera:<\/p>\n<blockquote><p>\u00abPHP JIT est\u00e1 implementado como una parte casi independiente de OPcache. Puede ser activado\/desactivado en tiempo de compilaci\u00f3n de PHP y en tiempo de ejecuci\u00f3n. Cuando se habilita, el c\u00f3digo nativo de los archivos PHP se almacena en una regi\u00f3n adicional de la memoria compartida de OPcache y los manejadores op_array\u2192opcodes[]. mantienen punteros a los puntos de entrada del c\u00f3digo JIT\u00bb.<\/p><\/blockquote>\n<p>Entonces, \u00bfc\u00f3mo llegamos a JIT y cu\u00e1l es la diferencia entre JIT vs. OPcache?<\/p>\n<p>Para entender mejor lo que es JIT para PHP, echemos un vistazo r\u00e1pido a c\u00f3mo<a href=\"https:\/\/kinsta.com\/es\/blog\/que-es-php\/\"> PHP<\/a>\u00a0se ejecuta desde el c\u00f3digo fuente hasta el resultado final.<\/p>\n<p>La ejecuci\u00f3n de PHP es un proceso de 4 etapas:<\/p>\n<ul>\n<li><strong>Lexing\/Tokenizaci\u00f3n<\/strong>: Primero, el int\u00e9rprete lee el c\u00f3digo PHP y construye un conjunto de fichas.<\/li>\n<li><strong>An\u00e1lisis<\/strong>: El int\u00e9rprete comprueba si el gui\u00f3n coincide con las reglas sint\u00e1cticas y utiliza fichas para construir un \u00c1rbol <a href=\"https:\/\/en.wikipedia.org\/wiki\/Abstract_syntax_tree\">de Sintaxis Abstracta<\/a> (AST), que es <a href=\"https:\/\/wiki.php.net\/rfc\/abstract_syntax_tree\">una representaci\u00f3n jer\u00e1rquica de la estructura del c\u00f3digo fuente<\/a>.<\/li>\n<li><strong>Recopilaci\u00f3n<\/strong>: El int\u00e9rprete atraviesa el \u00e1rbol y traduce los nodos AST en opcodes Zend de bajo nivel, que son identificadores num\u00e9ricos que determinan el tipo de <a href=\"https:\/\/nikic.github.io\/2017\/04\/14\/PHP-7-Virtual-machine.html\">instrucci\u00f3n realizada por el Zend VM<\/a>.<\/li>\n<li><strong>Interpretaci\u00f3n<\/strong>: Los c\u00f3digos \u00f3pticos se interpretan y se ejecutan en el VM Zend.<\/li>\n<\/ul>\n<p>La siguiente imagen muestra una representaci\u00f3n visual del proceso b\u00e1sico de ejecuci\u00f3n de PHP.<\/p>\n<figure style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/proceso-basico-ejecucion-php.png\" alt=\"Proceso b\u00e1sico de ejecuci\u00f3n de PHP\" width=\"1100\" height=\"1460\"><figcaption class=\"wp-caption-text\">Proceso b\u00e1sico de ejecuci\u00f3n de PHP<\/figcaption><\/figure>\n<p>Entonces, \u00bfc\u00f3mo hace OPcache que PHP sea m\u00e1s r\u00e1pido? \u00bfY qu\u00e9 cambia en el proceso de ejecuci\u00f3n con JIT?<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"decimal\" selector=\"h3\" count-number=\"3\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>La Extensi\u00f3n de OPcache<\/h3>\n<p>PHP es un lenguaje interpretado. Esto significa que cuando un script PHP se ejecuta, el int\u00e9rprete analiza, compila y ejecuta el c\u00f3digo una y otra vez en cada solicitud. Esto puede resultar en una <a href=\"https:\/\/phptherightway.com\/#opcode_cache\">p\u00e9rdida de recursos de la CPU<\/a>\u00a0y de tiempo adicional.<\/p>\n<p>Aqu\u00ed es donde entra en juego la\u00a0<a href=\"https:\/\/www.php.net\/manual\/en\/intro.opcache.php\">extensi\u00f3n de la OPcache<\/a>:<\/p>\n<blockquote><p>\u00abOPcache mejora el rendimiento de PHP almacenando el c\u00f3digo de bytes de los scripts precompilados en la memoria compartida, eliminando as\u00ed la necesidad de que PHP cargue y analice los scripts en cada solicitud\u00bb.<\/p><\/blockquote>\n<p>Con OPcache habilitado, el int\u00e9rprete de PHP pasa por el proceso de 4 etapas mencionado anteriormente s\u00f3lo la primera vez cuando se ejecuta el script. Dado que los bytecodes de PHP se almacenan en la memoria compartida, est\u00e1n disponibles inmediatamente como representaci\u00f3n intermedia de bajo nivel y pueden ser ejecutados en la VM Zend de inmediato.<\/p>\n<figure style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/proceso-ejecucion-php-opcache-habilitado.png\" alt=\"Proceso de ejecuci\u00f3n de PHP con OPcache habilitado\" width=\"1100\" height=\"1560\"><figcaption class=\"wp-caption-text\">Proceso de ejecuci\u00f3n de PHP con OPcache habilitado<\/figcaption><\/figure>\n<p>A partir de PHP 5.5, la extensi\u00f3n OPcache de Zend est\u00e1 disponible por defecto y puedes comprobar si la tienes correctamente configurada simplemente <a href=\"https:\/\/kinsta.com\/es\/blog\/phpinfo\/\">llamando a <code>phpinfo()<\/code><\/a> desde un script en tu servidor o comprobando tu archivo php.ini (ver <a href=\"https:\/\/www.php.net\/manual\/en\/opcache.configuration.php\">los ajustes de configuraci\u00f3n de OPcache<\/a>).<\/p>\n<p>Lectura sugerida: <a href=\"https:\/\/kinsta.com\/es\/blog\/php-memory-limite\/\">\u00bfC\u00f3mo mejorar el l\u00edmite de memoria de PHP en WordPress?<\/a><\/p>\n<figure style=\"width: 1926px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/section-zend-opcache-pagina-phpinfo.jpg\" alt=\"La secci\u00f3n Zend OPcache en una p\u00e1gina phpinfo\" width=\"1926\" height=\"992\"><figcaption class=\"wp-caption-text\">La secci\u00f3n Zend OPcache en una p\u00e1gina phpinfo<\/figcaption><\/figure>\n<h3>Precarga<\/h3>\n<p>Recientemente se ha mejorado OPcache con la implementaci\u00f3n de la <a href=\"https:\/\/wiki.php.net\/rfc\/preload\">precarga<\/a>, una nueva caracter\u00edstica de OPcache a\u00f1adida con\u00a0<a href=\"https:\/\/kinsta.com\/es\/blog\/php-7-4\/\">PHP 7.4<\/a>. La precarga proporciona una forma de almacenar un conjunto espec\u00edfico de scripts en la memoria OPcache \u00ab<i>antes de que se ejecute cualquier c\u00f3digo de aplicaci\u00f3n<\/i>\u00ab, pero no aporta una mejora tangible del rendimiento para las aplicaciones t\u00edpicas basadas en la web.<\/p>\n<p>Puedes leer m\u00e1s sobre la precarga en <a href=\"https:\/\/kinsta.com\/es\/blog\/php-7-4\/#preloading\">nuestra introducci\u00f3n a PHP 7.4<\/a>.<\/p>\n<p>Con JIT, PHP da un paso adelante.<\/p>\n<h3>JIT &#8211; El compilador Just in Time<\/h3>\n<p>Incluso si los opcodes est\u00e1n en forma de representaci\u00f3n intermedia de bajo nivel, todav\u00eda tienen que ser compilados en c\u00f3digo de m\u00e1quina. JIT \u00abno introduce ninguna forma adicional de IR (Representaci\u00f3n Intermedia)\u00bb, sino que utiliza <a href=\"https:\/\/luajit.org\/dynasm.html\">DynASM<\/a> (Dynamic Assembler para motores de generaci\u00f3n de c\u00f3digo) para generar c\u00f3digo nativo directamente desde el c\u00f3digo de bytes de PHP.<\/p>\n<p>En resumen, <strong>JIT traduce las partes calientes del c\u00f3digo intermedio a c\u00f3digo de m\u00e1quina<\/strong>. Pasando por alto la compilaci\u00f3n, ser\u00eda capaz de traer considerables mejoras en el rendimiento y el uso de la memoria.<\/p>\n<p>Zeev Surasky, co-autor de la propuesta PHP JIT, muestra cu\u00e1nto m\u00e1s r\u00e1pidos ser\u00edan los c\u00e1lculos con JIT:<\/p>\n<p><kinsta-video src=\"https:\/\/www.youtube.com\/watch?v=dWH65pmnsrI\"><\/kinsta-video><\/p>\n<p>Pero, \u00bfmejorar\u00eda el JIT efectivamente\u00a0<a href=\"https:\/\/kinsta.com\/es\/blog\/rendimiento-de-wordpress\/\">el rendimiento de WordPress<\/a>?<\/p>\n<h3>JIT para aplicaciones web en vivo<\/h3>\n<p>Seg\u00fan el JIT RFC, la implementaci\u00f3n del compilador \u00abjust in time\u00bb deber\u00eda mejorar el rendimiento de PHP. \u00bfPero realmente experimentar\u00edamos tales mejoras en aplicaciones de la vida real como WordPress?<\/p>\n<p>Las primeras pruebas muestran que el JIT har\u00eda que las cargas de trabajo intensivas de la CPU se ejecuten significativamente m\u00e1s r\u00e1pido, <a href=\"https:\/\/wiki.php.net\/rfc\/jit#performance\">sin embargo, el RFC advierte<\/a>:<\/p>\n<blockquote><p>\u00ab&#8230; como los intentos anteriores &#8211; actualmente no parecen mejorar significativamente las aplicaciones de la vida real como WordPress (con opcache.jit=1235 326 req\/sec vs 315 req\/sec).<\/p>\n<p>Se planea proporcionar un esfuerzo adicional, mejorando el JIT para las aplicaciones de la vida real, usando perfiles y optimizaciones especulativas\u00bb.<\/p><\/blockquote>\n<p>Con el JIT activado, el c\u00f3digo no ser\u00eda ejecutado por el VM de Zend, sino por la propia CPU, y esto mejorar\u00eda la velocidad de c\u00e1lculo. Las aplicaciones web como\u00a0<a href=\"https:\/\/kinsta.com\/es\/blog\/que-es-wordpress\/\">WordPress<\/a> tambi\u00e9n dependen de otros factores como\u00a0<a href=\"https:\/\/kinsta.com\/es\/blog\/ttfb\/\">TTFB<\/a>, <a href=\"https:\/\/kinsta.com\/es\/blog\/solucionar-reparar-problemas-base-datos\/\">optimizaci\u00f3n de bases de datos<\/a>, <a href=\"https:\/\/kinsta.com\/es\/aprender\/que-es-http2\/\">peticiones HTTP<\/a>, etc.<\/p>\n<p>As\u00ed que, cuando se trata de WordPress y aplicaciones similares, no deber\u00edamos esperar un gran aumento en la velocidad de ejecuci\u00f3n de PHP. Sin embargo, JIT podr\u00eda traer varios beneficios para\u00a0<a href=\"https:\/\/kinsta.com\/es\/blog\/salario-desarrollador-web\/\">los desarrolladores<\/a>.<\/p>\n<p><a href=\"https:\/\/externals.io\/message\/103903#103927\">Seg\u00fan Nikita Popov<\/a>:<\/p>\n<blockquote><p>\u00abLos beneficios del compilador de JIT son aproximadamente (y como ya se ha se\u00f1alado en el RFC):<\/p>\n<ul>\n<li>Un rendimiento significativamente mejor para el c\u00f3digo num\u00e9rico.<\/li>\n<li>Un rendimiento ligeramente mejor para el c\u00f3digo \u00abt\u00edpico\u00bb de una aplicaci\u00f3n web PHP.<\/li>\n<li>El potencial para mover m\u00e1s c\u00f3digo de C a PHP, porque PHP ser\u00e1 ahora suficientemente r\u00e1pido.\u00bb<\/li>\n<\/ul>\n<\/blockquote>\n<p>As\u00ed que, mientras que JIT dif\u00edcilmente traer\u00e1 grandes mejoras en el rendimiento de WordPress, estar\u00e1 actualizando el PHP al siguiente nivel, convirti\u00e9ndolo en un lenguaje en el que muchas funciones podr\u00edan ser escritas directamente.<\/p>\n<p>El inconveniente, sin embargo, ser\u00eda la mayor complejidad que puede llevar a un aumento de los costos de\u00a0<a href=\"https:\/\/kinsta.com\/es\/blog\/mantenimiento-de-wordpress\/\">mantenimiento<\/a>, estabilidad y <a href=\"https:\/\/kinsta.com\/es\/blog\/depuracion-wordpress\/\">depuraci\u00f3n<\/a>. De acuerdo con Dmitry Stogov:<\/p>\n<blockquote><p>\u00abEl JIT es extremadamente simple, pero de todas formas aumenta el nivel de toda la complejidad del PHP, el riesgo de nuevos tipos de errores y el costo de desarrollo y mantenimiento.\u00bb<\/p><\/blockquote>\n<p>La propuesta de incluir JIT en PHP 8 fue aprobada con 50 votos a favor y 2 en contra.<\/p>\n\n<h2>Mejoras y nuevas caracter\u00edsticas de PHP 8<\/h2>\n<p>Aparte de JIT, podemos esperar muchas caracter\u00edsticas y mejoras con PHP 8. La siguiente lista es nuestra selecci\u00f3n de las pr\u00f3ximas adiciones y cambios que deber\u00edan hacer a PHP m\u00e1s confiable y eficiente.<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"11\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3 id=\"constructor-property-promotion\">Promoci\u00f3n de la propiedad de los constructores<\/h3>\n<p>Como resultado de una discusi\u00f3n en curso sobre c\u00f3mo mejorar la ergonom\u00eda de los <a href=\"https:\/\/hive.blog\/php\/@crell\/improving-php-s-object-ergonomics\">objetos en PHP<\/a>, la\u00a0<a href=\"https:\/\/wiki.php.net\/rfc\/constructor_promotion\">RFC del Constructor property promotion<\/a> propone una nueva y m\u00e1s concisa sintaxis que simplificar\u00e1 la declaraci\u00f3n de la propiedad, haci\u00e9ndola m\u00e1s corta y menos redundante.<\/p>\n<p>Esta propuesta solo se refiere a los <strong>par\u00e1metros promovidos<\/strong>, es decir, los par\u00e1metros de m\u00e9todo prefijados con palabras clave de visibilidad <strong>p\u00fablica<\/strong>, <strong>protegidas<\/strong> y <strong>privadas<\/strong>.<\/p>\n<p>Actualmente, todas las propiedades tienen que ser repetidas varias veces (al menos cuatro veces) antes de que podamos usarlas con los objetos. Consideremos el siguiente ejemplo de la RFC:<\/p>\n<pre><code class=\"language-php\">class Point {\n    public int $x;\n    public int $y;\n    public int $z;\n\n    public function __construct(\n        int $x = 0,\n        int $y = 0,\n        int $z = 0,\n    ) {\n        $this-&gt;x = $x;\n        $this-&gt;y = $y;\n        $this-&gt;z = $z;\n    }\n}<\/code><\/pre>\n<p>De acuerdo con Nikita Popov, el autor del RFC, tenemos que escribir el nombre de la propiedad al menos cuatro veces en tres lugares diferentes: la declaraci\u00f3n de propiedad, los par\u00e1metros del constructor y la asignaci\u00f3n de la propiedad. Esta sintaxis no es particularmente utilizable, sobre todo en clases con un buen n\u00famero de propiedades y nombres m\u00e1s descriptivos.<\/p>\n<p>Esta RFC propone fusionar el constructor y la definici\u00f3n de los par\u00e1metros. As\u00ed, a partir de PHP 8, tenemos una forma m\u00e1s utilizable de declarar los par\u00e1metros y el c\u00f3digo visto anteriormente puede cambiar como se muestra a continuaci\u00f3n:<\/p>\n<pre><code class=\"language-php\">class Point {\n    public function __construct(\n        public int $x = 0,\n        public int $y = 0,\n        public int $z = 0,\n    ) {}\n}<\/code><\/pre>\n<p>Y eso es todo. As\u00ed que tenemos una nueva forma de promover las propiedades que es m\u00e1s corta, m\u00e1s legible y menos propensa a errores. <a href=\"https:\/\/phpinternals.news\/53\">De acuerdo con Nikita<\/a>:<\/p>\n<blockquote><p>Estamos haciendo una simple transformaci\u00f3n sint\u00e1ctica. Pero esto reduce la cantidad de c\u00f3digo que tienes que escribir para los objetos de valor en particular&#8230;<\/p><\/blockquote>\n<p><a href=\"https:\/\/www.php.net\/manual\/en\/intro.reflection.php\">La declaraci\u00f3n de la propiedad se transforma, ya que hab\u00edamos declarado expl\u00edcitamente esas propiedades y podemos utilizar la API Reflection<\/a> para introspectar las definiciones de las propiedades antes de la ejecuci\u00f3n (v\u00e9ase <a href=\"https:\/\/wiki.php.net\/rfc\/constructor_promotion#desugaring\">Desugaring<\/a>):<\/p>\n<blockquote><p>Reflection (y otros mecanismos de introspecci\u00f3n) observar\u00e1 el estado despu\u00e9s del desugaring. Esto significa que las propiedades promovidas aparecer\u00e1n de la misma manera que las propiedades expl\u00edcitamente declaradas, y los argumentos de construcci\u00f3n promovidos aparecer\u00e1n como argumentos de construcci\u00f3n ordinarios.<\/p><\/blockquote>\n<pre><code class=\"language-php\">\/\/ before desugaring\nclass Point {\n    public function __construct(public int $x = 0) {}\n}\n\n\/\/ after desugaring\nclass Point {\n    public int $x;\n\n    public function __construct(int $x = 0) {\n        $this-&gt;x = $x;\n    }\n}<\/code><\/pre>\n<h4>Herencia<\/h4>\n<p>No tenemos ninguna limitaci\u00f3n en el uso de la herencia en conjunto con los par\u00e1metros promovidos. De todos modos, no hay una relaci\u00f3n particular entre los padres y los hijos constructores de clase. <a href=\"https:\/\/phpinternals.news\/53\">Seg\u00fan Nikita<\/a>:<\/p>\n<blockquote><p>Normalmente decimos que los m\u00e9todos siempre tienen que ser compatibles con el m\u00e9todo de los padres. [&#8230;] pero esta regla no se aplica para el constructor. As\u00ed que el constructor realmente pertenece a una sola clase, y los constructores entre la clase padre e hijo no tienen que ser compatibles de ninguna manera.<\/p>\n<p>\u00a0<\/p><\/blockquote>\n<p>Aqu\u00ed tienes un ejemplo:<\/p>\n<pre><code class=\"language-php\">class Test {\n    public function __construct(\n        public int $x = 0\n    ) {}\n}\n\nclass Child extends Test {\n    public function __construct(\n        $x, \n        public int $y = 0,\n        public int $z = 0,\n    ) {\n        parent::__construct($x);\n    }\n}<\/code><\/pre>\n<h4>Lo que no se permite con las propiedades promocionadas<\/h4>\n<p>Las propiedades promocionadas est\u00e1n permitidas en los constructores y rasgos no abstractos, pero hay varias limitaciones que vale la pena mencionar aqu\u00ed.<\/p>\n<h5>Los constructores abstractos<\/h5>\n<p>Las propiedades promocionadas no est\u00e1n permitidas en las clases e interfaces abstractas:<\/p>\n<pre><code class=\"language-php\">abstract class Test {\n    \/\/ Error: Abstract constructor.\n    abstract public function __construct(private $x);\n}\n \ninterface Test {\n    \/\/ Error: Abstract constructor.\n    public function __construct(private $x);\n}<\/code><\/pre>\n<h5>Nulidad<\/h5>\n<p>Una de las limitaciones m\u00e1s notables est\u00e1 relacionada con la nulidad. Anteriormente, cuando utiliz\u00e1bamos un tipo que no era expl\u00edcitamente anulable, pero con un valor predeterminado nulo, el tipo era impl\u00edcitamente anulable. Pero con los tipos de propiedad, no tenemos este comportamiento impl\u00edcito porque los par\u00e1metros promovidos requieren una declaraci\u00f3n de propiedad, y el tipo anulable debe ser declarado expl\u00edcitamente. V\u00e9ase el siguiente ejemplo del RFC:<\/p>\n<pre><code class=\"language-php\">class Test {\n    \/\/ Error: Using null default on non-nullable property\n    public function __construct(public Type $prop = null) {}\n\n    \/\/ Correct: Make the type explicitly nullable instead\n    public function __construct(public ?Type $prop = null) {}\n}<\/code><\/pre>\n<h5>Tipo de llamada<\/h5>\n<p>Como el llamable no es un <a href=\"https:\/\/kinsta.com\/es\/blog\/php-7-4\/#typed-properties\">tipo soportado para las propiedades<\/a>, no se nos permite usar el tipo llamable en las propiedades promocionadas:<\/p>\n<pre><code class=\"language-php\">class Test {\n    \/\/ Error: Callable type not supported for properties.\n    public function __construct(public callable $callback) {}\n}<\/code><\/pre>\n<h5>La palabra clave var no est\u00e1 permitida<\/h5>\n<p>Solo se puede utilizar una palabra clave de visibilidad con los par\u00e1metros promocionados, por lo que no se permite declarar las propiedades del constructor con la palabra clave <code>var<\/code> (v\u00e9ase el siguiente ejemplo de la RFC):<\/p>\n<pre><code class=\"language-php\">class Test {\n    \/\/ Error: \"var\" keyword is not supported.\n    public function __construct(var $prop) {}\n}<\/code><\/pre>\n<h5>No se permiten duplicaciones<\/h5>\n<p>Podemos combinar las propiedades promocionadas y las propiedades expl\u00edcitas en la misma clase, pero las propiedades no pueden ser declaradas dos veces:<\/p>\n<pre><code class=\"language-php\">class Test {\n    public string $prop;\n    public int $explicitProp;\n\n    \/\/ Correct\n    public function __construct(public int $promotedProp, int $arg) {\n        $this-&gt;explicitProp = $arg;\n    }\n\n    \/\/ Error: Redeclaration of property.\n    public function __construct(public string $prop) {}\n}<\/code><\/pre>\n<h5>No se permiten par\u00e1metros variables<\/h5>\n<p>La raz\u00f3n aqu\u00ed es que el tipo declarado es diferente del par\u00e1metro variable, que en realidad es un conjunto:<\/p>\n<pre><code class=\"language-php\">class Test {\n    \/\/ Error: Variadic parameter.\n    public function __construct(public string ...$strings) {}\n}<\/code><\/pre>\n<h4>Otras lecturas<\/h4>\n<p>Para ver m\u00e1s de cerca el Constructor property promotion, escucha esta <a href=\"https:\/\/phpinternals.news\/53\">entrevista con Nikita Popov<\/a>. Para una visi\u00f3n en profundidad de la ergonom\u00eda de los objetos en PHP, lee <a href=\"https:\/\/hive.blog\/php\/@crell\/improving-php-s-object-ergonomics\">este post<\/a> y la siguiente <a href=\"https:\/\/phpinternals.news\/51\">entrevista con Larry Garfield<\/a>.<\/p>\n<h3 id=\"abstract-trait-methods\">Validaci\u00f3n de los m\u00e9todos de rasgos abstractos<\/h3>\n<p><a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.traits.php\">Los rasgos<\/a> se definen como \u00abun mecanismo para la reutilizaci\u00f3n del c\u00f3digo en lenguajes de herencia \u00fanica como el PHP\u00bb. T\u00edpicamente, se usan para declarar m\u00e9todos que pueden ser usados en m\u00faltiples clases.<\/p>\n<p>Un rasgo tambi\u00e9n puede contener m\u00e9todos abstractos. Estos m\u00e9todos simplemente declaran la firma del m\u00e9todo, pero la implementaci\u00f3n del m\u00e9todo debe hacerse dentro de la clase que utiliza el rasgo.<\/p>\n<p>De acuerdo con el\u00a0<a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.traits.php#language.oop5.traits.abstract\">manual de PHP<\/a>,<\/p>\n<blockquote><p>\u00abLos rasgos apoyan el uso de m\u00e9todos abstractos para imponer requisitos a la clase expositora.\u00bb<\/p><\/blockquote>\n<p>Esto tambi\u00e9n significa que las firmas de los m\u00e9todos deben coincidir. En otras palabras, el tipo y el n\u00famero de argumentos requeridos\u00a0<a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.abstract.php\">deben ser los mismos<\/a>.<\/p>\n<p>De todos modos, <a href=\"https:\/\/externals.io\/message\/108065#108164\">seg\u00fan Nikita Popov<\/a>, autor de la RFC, la validaci\u00f3n de la firma se aplica actualmente s\u00f3lo de manera puntual:<\/p>\n<blockquote>\n<ul>\n<li>No se aplica en el caso m\u00e1s com\u00fan, en el que la aplicaci\u00f3n del m\u00e9todo est\u00e1 a cargo de la clase que lo utiliza:\u00a0<a href=\"https:\/\/3v4l.org\/SeVK3\">https:\/\/3v4l.org\/SeVK3<\/a><\/li>\n<li>Se ejecuta si la aplicaci\u00f3n proviene de una clase de padres: <a href=\"https:\/\/3v4l.org\/4VCIp\">https:\/\/3v4l.org\/4VCIp<\/a><\/li>\n<li>Se ejecuta si la aplicaci\u00f3n proviene de una clase de hijos: <a href=\"https:\/\/3v4l.org\/q7Bq2\">https:\/\/3v4l.org\/q7Bq2<\/a><\/li>\n<\/ul>\n<\/blockquote>\n<p>El siguiente ejemplo de Nikita se refiere al primer caso (firma no ejecutada):<\/p>\n<pre><code class=\"language-php\">trait T {\n\tabstract public function test(int $x);\n}\n \nclass C {\n\tuse T;\n\n\t\/\/ Allowed, but shouldn't be due to invalid type.\n\tpublic function test(string $x) {}\n}<\/code><\/pre>\n<p>Dicho esto, <a href=\"https:\/\/wiki.php.net\/rfc\/abstract_trait_method_validation\">este RFC<\/a> propone lanzar siempre un error fatal si el m\u00e9todo de implementaci\u00f3n no es compatible con el m\u00e9todo del rasgo abstracto, independientemente de su origen:<\/p>\n<pre><code>Fatal error: Declaration of C::test(string $x) must be compatible with T::test(int $x) in \/path\/to\/your\/test.php on line 10<\/code><\/pre>\n<p>Esta RFC ha sido aprobada por unanimidad.<\/p>\n<h3 id=\"incompatible-method-signatures\">Firmas de m\u00e9todos incompatibles<\/h3>\n<p>En PHP, los errores de herencia debidos a firmas de m\u00e9todos incompatibles arrojan un error fatal o una advertencia, dependiendo de lo que est\u00e9 causando el error.<\/p>\n<p>Si una clase est\u00e1 implementando una interfaz, las firmas de m\u00e9todos incompatibles arrojan un error fatal. Seg\u00fan la\u00a0<a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.interfaces.php\">documentaci\u00f3n de las Interfaces de Objetos<\/a>:<\/p>\n<blockquote><p>\u00abLa clase que implemente la interfaz debe utilizar una firma de m\u00e9todo que sea compatible con el LSP (Principio de Sustituci\u00f3n de Liskov). No hacerlo resultar\u00e1 en un error fatal.\u00bb<\/p><\/blockquote>\n<p>He aqu\u00ed un ejemplo de un <a href=\"https:\/\/wiki.php.net\/rfc\/lsp_errors\">error de herencia con una interfaz<\/a>:<\/p>\n<pre><code class=\"language-php\">interface I {\n\tpublic function method(array $a);\n}\nclass C implements I {\n\tpublic function method(int $a) {}\n}<\/code><\/pre>\n<p>En PHP 7.4, el c\u00f3digo de arriba dar\u00eda el siguiente error:<\/p>\n<pre><code>Fatal error: Declaration of C::method(int $a) must be compatible with I::method(array $a) in \/path\/to\/your\/test.php on line 7<\/code><\/pre>\n<p>Una funci\u00f3n en una clase de hijos con una firma incompatible lanzar\u00eda una advertencia. Ve el siguiente c\u00f3digo del RFC:<\/p>\n<pre><code class=\"language-php\">class C1 {\n\tpublic function method(array $a) {}\n}\nclass C2 extends C1 {\n\tpublic function method(int $a) {}\n}<\/code><\/pre>\n<p>En PHP 7.4, el c\u00f3digo de arriba simplemente lanzar\u00eda una advertencia:<\/p>\n<pre><code>Warning: Declaration of C2::method(int $a) should be compatible with C1::method(array $a) in \/path\/to\/your\/test.php on line 7<\/code><\/pre>\n<p>Ahora, <a href=\"https:\/\/wiki.php.net\/rfc\/lsp_errors\">este RFC<\/a> propone lanzar siempre un error fatal para las firmas de m\u00e9todos incompatibles. Con PHP 8, el c\u00f3digo que vimos anteriormente arriba indicar\u00eda lo siguiente:<\/p>\n<pre><code>Fatal error: Declaration of C2::method(int $a) must be compatible with C1::method(array $a) in \/path\/to\/your\/test.php on line 7<\/code><\/pre>\n<h3 id=\"negative-array-index\">Los arreglos que comienzan con un \u00edndice negativo<\/h3>\n<p>En PHP, si una matriz comienza con un \u00edndice negativo (<code>start_index &lt; 0<\/code>), los siguientes \u00edndices comenzar\u00e1n desde 0 (m\u00e1s sobre esto en la\u00a0<a href=\"https:\/\/www.php.net\/manual\/en\/function.array-fill.php\">documentaci\u00f3n de <code>array_fill<\/code>).<\/a> Observa el siguiente ejemplo:<\/p>\n<pre><code class=\"language-php\">$a = array_fill(-5, 4, true);\nvar_dump($a);<\/code><\/pre>\n<p>En PHP 7.4 el resultado ser\u00eda el siguiente:<\/p>\n<pre><code>array(4) {\n\t[-5]=&gt;\n\tbool(true)\n\t[0]=&gt;\n\tbool(true)\n\t[1]=&gt;\n\tbool(true)\n\t[2]=&gt;\n\tbool(true)\n}<\/code><\/pre>\n<p>Ahora,<a href=\"https:\/\/wiki.php.net\/rfc\/negative_array_index\">\u00a0RFC<\/a> propone cambiar las cosas para que el segundo \u00edndice sea <code>start_index + 1<\/code>, cualquiera que sea el valor de <code>start_index<\/code>.<\/p>\n<p>En PHP 8, el c\u00f3digo de arriba resultar\u00eda en la siguiente matriz:<\/p>\n<pre><code>array(4) {\n\t[-5]=&gt;\n\tbool(true)\n\t[-4]=&gt;\n\tbool(true)\n\t[-3]=&gt;\n\tbool(true)\n\t[-2]=&gt;\n\tbool(true)\n}<\/code><\/pre>\n<p>Con PHP 8, las matrices que comienzan con un \u00edndice negativo cambian su comportamiento. Lee m\u00e1s sobre las incompatibilidades hacia atr\u00e1s en <a href=\"https:\/\/wiki.php.net\/rfc\/negative_array_index#backward_incompatible_changes\">el RFC<\/a>.<\/p>\n<h3 id=\"union-types-2-0\">Tipos de Uni\u00f3n 2.0<\/h3>\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Union_type\">Los tipos de uni\u00f3n <\/a>aceptan valores que pueden ser de diferentes tipos. Actualmente, PHP no provee soporte para tipos de uni\u00f3n, con la excepci\u00f3n de la sintaxis del <code>?Type<\/code> y el tipo especial <code>iterable<\/code>.<\/p>\n<p>Antes de PHP 8, los tipos de uni\u00f3n s\u00f3lo pod\u00edan ser especificados en anotaciones phpdoc, como se muestra en el siguiente ejemplo del RFC:<\/p>\n<pre><code class=\"language-php\">class Number {\n\t\/**\n\t * @var int|float $number\n\t *\/\n\tprivate $number;\n\n\t\/**\n\t * @param int|float $number\n\t *\/\n\tpublic function setNumber($number) {\n\t\t$this-&gt;number = $number;\n\t}\n\n\t\/**\n\t * @return int|float\n\t *\/\n\tpublic function getNumber() {\n\t\treturn $this-&gt;number;\n\t}\n}<\/code><\/pre>\n<p>Ahora, <a href=\"https:\/\/wiki.php.net\/rfc\/union_types_v2\">el RFC de los tipos de uni\u00f3n 2.0<\/a> propone a\u00f1adir soporte para los tipos de uni\u00f3n en las firmas de las funciones, de manera que no dependeremos m\u00e1s de la documentaci\u00f3n en l\u00ednea, sino que definiremos los tipos de uni\u00f3n con una sintaxis <code>T1|T2|...<\/code> en su lugar:<\/p>\n<pre><code class=\"language-php\">class Number {\n\tprivate int|float $number;\n\n\tpublic function setNumber(int|float $number): void {\n\t\t$this-&gt;number = $number;\n\t}\n\n\tpublic function getNumber(): int|float {\n\t\treturn $this-&gt;number;\n\t}\n}<\/code><\/pre>\n<p>Como explic\u00f3 Nikita Popov en el RFC,<\/p>\n<blockquote><p>\u00abApoyar los tipos de uni\u00f3n en el lenguaje nos permite pasar m\u00e1s informaci\u00f3n de tipos de phpdoc a firmas de funciones, con las ventajas habituales que esto conlleva:<\/p>\n<ul>\n<li>Los tipos se aplican realmente, as\u00ed que los errores se pueden detectar a tiempo.<\/li>\n<li>Debido a que se hacen cumplir, es menos probable que la informaci\u00f3n tipo se vuelva anticuada o que se pierda en los bordes de los casos.<\/li>\n<li>Los tipos se comprueban durante la herencia, aplicando el principio de sustituci\u00f3n de Liskov.<\/li>\n<li>Los tipos est\u00e1n disponibles a trav\u00e9s de Reflection.<\/li>\n<li>La sintaxis es mucho menos \u00abboilerplate-y\u00bb que \u00abphpdoc\u00bb.<\/li>\n<\/ul>\n<\/blockquote>\n<p>Los tipos de uni\u00f3n apoyan todos los tipos disponibles, con algunas limitaciones:<\/p>\n<ul>\n<li>El tipo de <code>void<\/code> no podr\u00eda formar parte de una uni\u00f3n, ya que <code>void<\/code> significa que una funci\u00f3n\u00a0<a href=\"https:\/\/wiki.php.net\/rfc\/void_return_type\">no devuelve ning\u00fan valor<\/a>.<\/li>\n<li>El tipo <code>null<\/code> s\u00f3lo se admite en los tipos de uni\u00f3n, pero su uso como tipo independiente no est\u00e1 permitido.<\/li>\n<li>La notaci\u00f3n de tipo null (<code>?T<\/code>) tambi\u00e9n est\u00e1 permitida, es decir, <code>T|null<\/code>, pero no se nos permite incluir la notaci\u00f3n <code>?T<\/code> en los tipos de uni\u00f3n (<code>?T1|T2<\/code> no est\u00e1 permitida y debemos usar <code>T1|T2|null<\/code> en su lugar).<\/li>\n<li>Como muchas funciones (es decir, <code>strpos()<\/code>, <code>strstr()<\/code>, <code>substr()<\/code>, etc.) incluyen <code>false<\/code> entre los posibles tipos de retorno, el <code>false<\/code> pseudo-tipo tambi\u00e9n est\u00e1 soportado.<\/li>\n<\/ul>\n<p>Puedes leer m\u00e1s sobre los <a href=\"https:\/\/wiki.php.net\/rfc\/union_types_v2\">Tipos de Uni\u00f3n V2<\/a> en el RFC.<\/p>\n<h3 id=\"type-errors-internal-functions\">Errores de tipo consistentes para las funciones internas<\/h3>\n<p>Al pasar un par\u00e1metro de tipo ilegal, las funciones <a href=\"https:\/\/www.php.net\/manual\/en\/functions.internal.php\">internas<\/a> y las definidas por el <a href=\"https:\/\/www.php.net\/manual\/en\/functions.user-defined.php\">usuario<\/a> se comportan de manera diferente.<\/p>\n<p>Las funciones definidas por el usuario arrojan un error <code>TypeError<\/code>, pero las funciones internas se comportan de diversas maneras, dependiendo de varias condiciones. De todos modos, el comportamiento t\u00edpico es lanzar una advertencia y volver <code>null<\/code>. Ve el siguiente ejemplo en PHP 7.4:<\/p>\n<pre><code class=\"language-php\">var_dump(strlen(new stdClass));<\/code><\/pre>\n<p>Esto resultar\u00eda en la siguiente advertencia:<\/p>\n<pre><code>Warning: strlen() expects parameter 1 to be string, object given in \/path\/to\/your\/test.php on line 4\nNULL<\/code><\/pre>\n<p>Si se habilita la opci\u00f3n <code>strict_types<\/code>, o la informaci\u00f3n del argumento especifica los tipos, el comportamiento ser\u00eda diferente. En tales escenarios, el error de tipo se detecta y resulta en un <code>TypeError<\/code>.<\/p>\n<p>Esta situaci\u00f3n dar\u00eda lugar a una serie de problemas bien explicados en <a href=\"https:\/\/wiki.php.net\/rfc\/consistent_type_errors#issues\">secci\u00f3n de cuestiones de la RFC<\/a>.<\/p>\n<p>Para eliminar estas inconsistencias, este<a href=\"https:\/\/wiki.php.net\/rfc\/consistent_type_errors\">\u00a0RFC propone<\/a> hacer que las APIs de an\u00e1lisis de par\u00e1metros internos generen siempre un <code>ThrowError<\/code> en caso de una falta de coincidencia de tipo de par\u00e1metro.<\/p>\n<p>En PHP 8, el c\u00f3digo de arriba arroja el siguiente error:<\/p>\n<pre><code>Fatal error: Uncaught TypeError: strlen(): Argument #1 ($str) must be of type string, object given in \/path\/to\/your\/test.php:4\nStack trace:\n#0 {main}\n  thrown in \/path\/to\/your\/test.php on line 4<\/code><\/pre>\n<h3 id=\"throw-expression\">throw Expresi\u00f3n<\/h3>\n<p>En PHP, <code>throw<\/code> es una <a href=\"https:\/\/www.php.net\/manual\/en\/control-structures.intro.php\">declaraci\u00f3n<\/a>, por lo que no es posible usarla en lugares donde s\u00f3lo se permite una <a href=\"https:\/\/www.php.net\/manual\/en\/language.expressions.php\">expresi\u00f3n<\/a>.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/throw_expression\">Este RFC<\/a> propone convertir la\u00a0<a href=\"https:\/\/www.php.net\/manual\/en\/language.exceptions.php\">declaraci\u00f3n de <code>throw<\/code><\/a> en una expresi\u00f3n para que pueda ser utilizada en cualquier contexto donde se permitan las expresiones. Por ejemplo, <a href=\"https:\/\/kinsta.com\/es\/blog\/php-7-4\/#arrow-functions\">funciones de flecha<\/a>, <a href=\"https:\/\/wiki.php.net\/rfc\/isset_ternary\">operador de coalescencia nula<\/a>, <a href=\"https:\/\/www.php.net\/manual\/en\/language.operators.comparison.php#language.operators.comparison.ternary\">operadores ternario y elvis<\/a>, etc.<\/p>\n<p>Vea los siguientes ejemplos de la RFC:<\/p>\n<pre><code class=\"language-php\">$callable = fn() =&gt; throw new Exception();\n\n\/\/ $value is non-nullable.\n$value = $nullableValue ?? throw new InvalidArgumentException();\n \n\/\/ $value is truthy.\n$value = $falsableValue ?: throw new InvalidArgumentException();<\/code><\/pre>\n<h3 id=\"weak-maps\">Mapas d\u00e9biles<\/h3>\n<p>Un mapa d\u00e9bil es una colecci\u00f3n de datos (objetos) en la que las claves est\u00e1n d\u00e9bilmente referenciadas, lo que significa que no son impedidos que recojan la basura.<\/p>\n<p>PHP 7.4 a\u00f1adi\u00f3 soporte para\u00a0<a href=\"https:\/\/kinsta.com\/es\/blog\/php-7-4\/#weakreferences\">referencias d\u00e9biles<\/a> como una forma de retener una referencia a un objeto que no evita que el objeto mismo sea destruido. Como se\u00f1al\u00f3 Nikita Popov,<\/p>\n<blockquote><p>\u00abLas referencias d\u00e9biles en bruto s\u00f3lo tienen una utilidad limitada por s\u00ed mismas y los mapas d\u00e9biles se utilizan mucho m\u00e1s com\u00fanmente en la pr\u00e1ctica. No es posible implementar un mapa d\u00e9bil eficiente encima de las referencias d\u00e9biles del PHP porque no se proporciona la capacidad de registrar una llamada de destrucci\u00f3n.\u00bb<\/p><\/blockquote>\n<p>Por eso\u00a0<a href=\"https:\/\/wiki.php.net\/rfc\/weak_maps\">este RFC<\/a> introduce una clase de <code>WeakMap<\/code> para crear objetos para ser usados como claves de mapas d\u00e9biles que pueden ser destruidos y eliminados del mapa d\u00e9bil si no hay m\u00e1s referencias al objeto clave.<\/p>\n<p>En los procesos de larga duraci\u00f3n, esto evitar\u00eda las fugas de memoria y mejorar\u00eda el rendimiento. Como se ve en el siguiente ejemplo de la RFC:<\/p>\n<pre><code class=\"language-php\">$map = new WeakMap;\n$obj = new stdClass;\n$map[$obj] = 42;\nvar_dump($map);<\/code><\/pre>\n<p>Con PHP 8, el c\u00f3digo anterior producir\u00eda el siguiente resultado (ver\u00a0<a href=\"https:\/\/3v4l.org\/o6lZX\/rfc#output\">el c\u00f3digo en acci\u00f3n aqu\u00ed<\/a>):<\/p>\n<pre><code>object(WeakMap)#1 (1) {\n\t[0]=&gt;\n\tarray(2) {\n\t\t[\"key\"]=&gt;\n\t\tobject(stdClass)#2 (0) {\n\t\t}\n\t\t[\"value\"]=&gt;\n\t\tint(42)\n\t}\n}<\/code><\/pre>\n<p>Si desajustas el objeto, la llave se elimina autom\u00e1ticamente del mapa d\u00e9bil:<\/p>\n<pre><code class=\"language-php\">unset($obj);\nvar_dump($map);<\/code><\/pre>\n<p>Ahora el resultado ser\u00eda el siguiente:<\/p>\n<pre><code>object(WeakMap)#1 (0) {\n}<\/code><\/pre>\n<p>Para ver m\u00e1s de cerca los mapas d\u00e9biles, mira <a href=\"https:\/\/wiki.php.net\/rfc\/weak_maps\">el RFC<\/a>. La propuesta fue aprobada por unanimidad.<\/p>\n<h3 id=\"trailing-commas\">Coma de arrastre en la lista de par\u00e1metros<\/h3>\n<p>Las comas finales son comillas que se a\u00f1aden a las listas de art\u00edculos en diferentes contextos. PHP 7.2 <a href=\"https:\/\/kinsta.com\/es\/blog\/php-7-2\/#trailing-commas-in-list-syntax\">introdujo las comillas en la sintaxis de las listas<\/a>, PHP 7.3 introdujo\u00a0<a href=\"https:\/\/kinsta.com\/es\/blog\/nueva-version-php-7-3\/#trailing-comma-in-function-calls\">las comillas en las llamadas a funciones<\/a>.<\/p>\n<p>PHP 8 introduce ahora\u00a0<a href=\"https:\/\/wiki.php.net\/rfc\/trailing_comma_in_parameter_list\">comillas en las listas de par\u00e1metros<\/a> con funciones, m\u00e9todos y cierres, como se muestra en el siguiente ejemplo:<\/p>\n<pre><code class=\"language-php\">class Foo {\n\tpublic function __construct(\n\t\tstring $x,\n\t\tint $y,\n\t\tfloat $z, \/\/ trailing comma\n\t) {\n\t\t\/\/ do something\n\t}\n}<\/code><\/pre>\n<p>Esta propuesta fue aprobada con 58 votos a favor y 1 en contra.<\/p>\n<h3 id=\"class-syntax-on-objects\">Allow ::class syntax en los objetos<\/h3>\n<p>Para buscar el nombre de una clase, podemos usar la sintaxis de <code>FooBar::class<\/code>. <a href=\"https:\/\/wiki.php.net\/rfc\/class_name_literal_on_object\">Este RFC<\/a> propone extender la misma sintaxis a los objetos, de modo que ahora es posible obtener el nombre de la clase de un objeto dado, como se muestra en el siguiente ejemplo:<\/p>\n<pre><code class=\"language-php\">$object = new stdClass;\nvar_dump($object::class); \/\/ \"stdClass\"\n \n$object = null;\nvar_dump($object::class); \/\/ TypeError<\/code><\/pre>\n<p>Con PHP 8, <code>$object::class<\/code> proporciona el mismo resultado que <code>get_class($object)<\/code>. Si <code>$object<\/code> no es un objeto, lanza una excepci\u00f3n <code>TypeError<\/code>.<\/p>\n<p>Esta propuesta fue aprobada por unanimidad.<\/p>\n<h3 id=\"attributes\">Atributos v2<\/h3>\n<p>Los atributos, tambi\u00e9n conocidos como anotaciones, son una forma de metadatos estructurados que pueden utilizarse para especificar las propiedades de los objetos, elementos o archivos.<\/p>\n<p>Hasta PHP 7.4, los doc-comentarios eran la \u00fanica forma de a\u00f1adir metadatos a las declaraciones de clases, funciones, etc. Ahora, el\u00a0<a href=\"https:\/\/wiki.php.net\/rfc\/attributes_v2\">RFC Attributes v2<\/a> introduce atributos para PHP defini\u00e9ndolos como una forma de metadatos estructurados y sint\u00e1cticos que pueden ser agregados a declaraciones de clases, propiedades, funciones, m\u00e9todos, par\u00e1metros y constantes.<\/p>\n<p>Los atributos se a\u00f1aden antes de las declaraciones a las que se refieren. Mira los siguientes ejemplos de la RFC:<\/p>\n<pre><code class=\"language-php\">&lt;&lt;ExampleAttribute&gt;&gt;\nclass Foo\n{\n\t&lt;&lt;ExampleAttribute&gt;&gt;\n\tpublic const FOO = 'foo';\n\n\t&lt;&lt;ExampleAttribute&gt;&gt;\n\tpublic $x;\n\n\t&lt;&lt;ExampleAttribute&gt;&gt;\n\tpublic function foo(&lt;&lt;ExampleAttribute&gt;&gt; $bar) { }\n}\n\n$object = new &lt;&lt;ExampleAttribute&gt;&gt; class () { };\n\n&lt;&lt;ExampleAttribute&gt;&gt;\nfunction f1() { }\n\n$f2 = &lt;&lt;ExampleAttribute&gt;&gt; function () { };\n\n$f3 = &lt;&lt;ExampleAttribute&gt;&gt; fn () =&gt; 1;<\/code><\/pre>\n<p>Los atributos pueden ser a\u00f1adidos antes o despu\u00e9s de un comentario del bloque de documentos:<\/p>\n<pre><code class=\"language-php\">&lt;&lt;ExampleAttribute&gt;&gt;\n\/** docblock *\/\n&lt;&lt;AnotherExampleAttribute&gt;&gt;\nfunction foo() {}<\/code><\/pre>\n<p>Cada declaraci\u00f3n puede tener uno o m\u00e1s atributos y cada atributo puede tener uno o m\u00e1s valores asociados:<\/p>\n<pre><code class=\"language-php\">&lt;&lt;WithoutArgument&gt;&gt;\n&lt;&lt;SingleArgument(0)&gt;&gt;\n&lt;&lt;FewArguments('Hello', 'World')&gt;&gt;\nfunction foo() {}<\/code><\/pre>\n<p>Mira el <a href=\"https:\/\/wiki.php.net\/rfc\/attributes_v2\">RFC<\/a> para una visi\u00f3n m\u00e1s profunda de los atributos de PHP, casos de uso y sintaxis alternativa.<\/p>\n<h2 id=\"new-php-functions\">Nuevas funciones PHP<\/h2>\n<p>PHP 8 trae varias funciones nuevas al lenguaje:<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"-1\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3 id=\"str_contains\">str_contains<\/h3>\n<p>Antes de PHP 8, <a href=\"https:\/\/www.php.net\/manual\/en\/function.strstr.php\">strstr<\/a> y <a href=\"https:\/\/www.php.net\/manual\/en\/function.strpos.php\">strpos<\/a> eran las opciones t\u00edpicas de\u00a0<a href=\"https:\/\/kinsta.com\/es\/blog\/contratar-desarrollador-de-wordpress\/\">los desarrolladores<\/a> para buscar una aguja dentro de una cadena dada. El problema es que ambas funciones no son consideradas muy intuitivas y su uso puede ser confuso para los nuevos desarrolladores de PHP. Ve el siguiente ejemplo:<\/p>\n<pre><code class=\"language-php\">$mystring = 'Managed WordPress Hosting';\n$findme = 'WordPress';\n$pos = strpos($mystring, $findme);\n\nif ($pos !== false) {\n\techo \"The string has been found\";\n} else {\n\techo \"String not found\";\n}<\/code><\/pre>\n<p>En el ejemplo anterior utilizamos el operador de comparaci\u00f3n <code>!==<\/code>, que tambi\u00e9n comprueba si dos valores son del mismo tipo. Esto evita que obtengamos un error\u00a0<a href=\"https:\/\/www.php.net\/manual\/en\/function.strpos.php#refsect1-function.strpos-returnvalues\">si la posici\u00f3n de la aguja es 0<\/a>:<\/p>\n<blockquote><p>\u00abEsta funci\u00f3n puede devolver <strong>FALSE<\/strong>\u00a0Booleano, pero tambi\u00e9n puede devolver un valor no booleano que eval\u00faa a <strong>FALSE<\/strong>. [&#8230;] Usa el operador === para probar el valor de retorno de esta funci\u00f3n.\u00bb<\/p><\/blockquote>\n<p>Adem\u00e1s, varios marcos ofrecen funciones de ayuda para buscar un valor dentro de una cadena determinada (ver <a href=\"https:\/\/laravel.com\/docs\/7.x\/helpers#method-str-contains\">la documentaci\u00f3n de Laravel Helpers<\/a> como ejemplo).<\/p>\n<p>Ahora, <a href=\"https:\/\/wiki.php.net\/rfc\/str_contains\">este RFC<\/a> propone la introducci\u00f3n de una nueva funci\u00f3n que permite buscar dentro de una cadena: <code>str_contains<\/code>.<\/p>\n<pre><code class=\"language-php\">str_contains ( string $haystack , string $needle ) : bool<\/code><\/pre>\n<p>Su uso es bastante sencillo. <code>str_contains<\/code> comprobaciones si se encuentra <code>$needle<\/code> en <code>$haystack<\/code> y devuelve <code>true<\/code> o <code>false<\/code> en consecuencia.<\/p>\n<p>As\u00ed que, gracias a <code>str_contains<\/code>, podemos escribir el siguiente c\u00f3digo:<\/p>\n<pre><code class=\"language-php\">$mystring = 'Managed WordPress Hosting';\n$findme   = 'WordPress';\n\nif (str_contains($mystring, $findme)) {\n\techo \"The string has been found\";\n} else {\n\techo \"String not found\";\n}<\/code><\/pre>\n<p>Que es m\u00e1s legible y menos propenso a errores (ver este c\u00f3digo en acci\u00f3n\u00a0<a href=\"https:\/\/3v4l.org\/rcmEq\/rfc#git-php-master\">aqu\u00ed<\/a>).<br \/>\nEn el momento de escribir esto, <code>str_contains<\/code> es sensible a las may\u00fasculas y min\u00fasculas, pero esto podr\u00eda cambiar en el futuro.<\/p>\n<p>La propuesta de <code>str_contains<\/code> aprobada con 43 a 9 votos.<\/p>\n<h3 id=\"str_starts_with-and-str_ends_with\">str_starts_with() y str_ends_with()<\/h3>\n<p>Adem\u00e1s de la funci\u00f3n <code>str_contains<\/code>, dos nuevas funciones permiten buscar una aguja dentro de una cadena dada: <code>str_starts_with<\/code> y <code>str_ends_with<\/code>.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/add_str_starts_with_and_ends_with_functions\">Estas nuevas funciones<\/a> comprueban si una determinada cadena comienza o termina con otra cadena:<\/p>\n<pre><code class=\"language-php\">str_starts_with (string $haystack , string $needle) : bool\nstr_ends_with (string $haystack , string $needle) : bool<\/code><\/pre>\n<p>Ambas funciones devuelven <code>false<\/code> si <code>$needle<\/code> es m\u00e1s larga que el <code>$haystack<\/code>.<\/p>\n<p>Seg\u00fan Will Hudgins, el autor de este RFC,<\/p>\n<blockquote><p>\u00abLa funcionalidad <code>str_starts_with<\/code> y <code>str_ends_with<\/code> es tan com\u00fanmente necesaria que muchos de los <a href=\"https:\/\/kinsta.com\/es\/blog\/frameworks-php\/\">principales marcos PHP<\/a> la soportan, incluyendo\u00a0<a href=\"https:\/\/symfony.com\/doc\/5.0\/components\/string.html#methods-to-search-and-replace\">Symfony<\/a>, <a href=\"https:\/\/laravel.com\/docs\/7.x\/helpers#method-starts-with\">Laravel<\/a>, <a href=\"https:\/\/www.yiiframework.com\/doc\/api\/2.0\/yii-helpers-basestringhelper#startsWith()-detail\">Yii<\/a>, <a href=\"https:\/\/fuelphp.com\/docs\/classes\/str.html#\/method_starts_with\">FuelPHP,<\/a><a href=\"https:\/\/www.yiiframework.com\/doc\/api\/2.0\/yii-helpers-basestringhelper#startsWith()-detail\"> y <\/a><a href=\"https:\/\/docs.phalcon.io\/3.4\/en\/api\/phalcon_text\">Phalcon<\/a>.\u00bb<\/p><\/blockquote>\n<p>Gracias a ellos, ahora podemos evitar el uso de funciones sub\u00f3ptimas y menos intuitivas como <code>substr<\/code>, <code>strpos<\/code>. Ambas funciones son sensibles a las may\u00fasculas y min\u00fasculas:<\/p>\n<pre><code class=\"language-php\">$str = \"WordPress\";\nif (str_starts_with($str, \"Word\")) echo \"Found!\";\n\nif (str_starts_with($str, \"word\")) echo \"Not found!\";<\/code><\/pre>\n<p>Puedes ver este c\u00f3digo en acci\u00f3n\u00a0<a href=\"https:\/\/3v4l.org\/kBcjZ\/rfc#output\">aqu\u00ed<\/a>.<\/p>\n<p>Este RFC ha sido aprobado con 51 votos a favor y 4 en contra.<\/p>\n<h3 id=\"get_debug_type\">get_debug_type<\/h3>\n<p><code>get_debug_type<\/code> es <a href=\"https:\/\/wiki.php.net\/rfc\/get_debug_type\">una nueva funci\u00f3n PHP <\/a>que devuelve el tipo de una variable. La nueva funci\u00f3n funciona de manera bastante similar a la\u00a0<a href=\"https:\/\/www.php.net\/manual\/en\/function.gettype.php\">funci\u00f3n <code>gettype<\/code><\/a>, pero <code>get_debug_type<\/code> devuelve nombres de tipo nativos y resuelve nombres de clase.<\/p>\n<p>Es una buena mejora para el lenguaje, ya que <code>gettype()<\/code> no es \u00fatil para la comprobaci\u00f3n de tipos.<\/p>\n<p>El RFC proporciona dos ejemplos \u00fatiles para entender mejor la diferencia entre la nueva funci\u00f3n <code>get_debug_type()<\/code> y <code>gettype()<\/code>. El primer ejemplo muestra a <code>gettype<\/code> trabajando:<\/p>\n<pre><code class=\"language-php\">$bar = [1,2,3];\n\nif (!($bar instanceof Foo)) { \n\tthrow new TypeError('Expected ' . Foo::class . ', got ' . (is_object($bar) ? get_class($bar) : gettype($bar)));\n}<\/code><\/pre>\n<p>Con PHP 8, podr\u00edamos usar <code>get_debug_type<\/code>, en su lugar:<\/p>\n<pre><code class=\"language-php\">if (!($bar instanceof Foo)) { \n\tthrow new TypeError('Expected ' . Foo::class . ' got ' . get_debug_type($bar));\n}<\/code><\/pre>\n<p>La siguiente tabla muestra los valores de retorno de <code>get_debug_type<\/code> y <code>gettype<\/code>:<\/p>\n<table>\n<thead>\n<tr>\n<th>Valor<\/th>\n<th>gettype()<\/th>\n<th>get_debug_type()<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>integer<\/td>\n<td>int<\/td>\n<\/tr>\n<tr>\n<td>0.1<\/td>\n<td>double<\/td>\n<td>float<\/td>\n<\/tr>\n<tr>\n<td>true<\/td>\n<td>boolean<\/td>\n<td>bool<\/td>\n<\/tr>\n<tr>\n<td>false<\/td>\n<td>boolean<\/td>\n<td>bool<\/td>\n<\/tr>\n<tr>\n<td>null<\/td>\n<td>NULL<\/td>\n<td>null<\/td>\n<\/tr>\n<tr>\n<td>\u00abWordPress\u00bb<\/td>\n<td>string<\/td>\n<td>string<\/td>\n<\/tr>\n<tr>\n<td>[1,2,3]<\/td>\n<td>array<\/td>\n<td>array<\/td>\n<\/tr>\n<tr>\n<td>Una clase con el nombre de \u00abFoo\\Bar\u00bb<\/td>\n<td>object<\/td>\n<td>Foo\\Bar<\/td>\n<\/tr>\n<tr>\n<td>Una clase an\u00f3nima<\/td>\n<td>object<\/td>\n<td>class@anonymous<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 id=\"additional-rfcs\">RFC adicionales<\/h2>\n<p>En el momento de redactar este documento, varios RFC destinados a PHP 8 est\u00e1n\u00a0<a href=\"https:\/\/wiki.php.net\/rfc#in_draft\">todav\u00eda en borrador<\/a> y\/o\u00a0<a href=\"https:\/\/wiki.php.net\/rfc#pending_implementationlanding\">pendientes de implementaci\u00f3n<\/a>. Las a\u00f1adiremos tan pronto como su estado cambie a \u00abImplementadas\u00bb.<\/p>\n<p>Aqu\u00ed hay una lista r\u00e1pida de mejoras adicionales aprobadas que ser\u00e1n parte de PHP 8:<\/p>\n<ol>\n<li><strong>Interfaz encadenable<\/strong>: <a href=\"https:\/\/wiki.php.net\/rfc\/stringable\">este RFC<\/a> introduce una interfaz encadenable que se a\u00f1ade autom\u00e1ticamente a las clases que implementan el\u00a0<a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.magic.php#object.tostring\">m\u00e9todo <code>__to String()<\/code><\/a>. El objetivo principal aqu\u00ed es usar el tipo de uni\u00f3n <code>string|Stringable<\/code>.<\/li>\n<li><strong>Nuevas APIs de DOM Living Standard en ext\/dom<\/strong>: <a href=\"https:\/\/wiki.php.net\/rfc\/dom_living_standard_api\">este RFC<\/a> propone implementar el actual\u00a0<a href=\"https:\/\/dom.spec.whatwg.org\/\">DOM Living Standard<\/a> a la\u00a0<a href=\"https:\/\/www.php.net\/manual\/en\/intro.dom.php\">extensi\u00f3n PHP DOM <\/a>introduciendo nuevas interfaces y propiedades p\u00fablicas.<\/li>\n<li><strong>Tipo de retorno est\u00e1tico<\/strong>: PHP 8 introduce el uso de la <code>static<\/code> como tipo de retorno junto a los tipos <code>self<\/code> y <code>parent<\/code>.<\/li>\n<li><strong>Ajustes en la sintaxis variable<\/strong>: <a href=\"https:\/\/wiki.php.net\/rfc\/variable_syntax_tweaks\">este RFC<\/a> resuelve algunas inconsistencias residuales en la sintaxis variable de PHP.<\/li>\n<\/ol>\n\n<h2>Resumen<\/h2>\n<p>\u00a1Qu\u00e9 paseo! En este post, cubrimos todos los cambios y mejoras claves que se esperan con el lanzamiento de PHP 8. La m\u00e1s esperada de ellas es seguramente el compilador Just in Time, pero hay mucho m\u00e1s que viene con PHP 8.<\/p>\n<p>Aseg\u00farate de marcar esta entrada del blog ya que a\u00f1adiremos nuestros favoritos a la lista tan pronto como sean aprobados. \ud83e\udd13<\/p>\n<p>Ahora es tu turno: \u00bfest\u00e1s listo para probar las pr\u00f3ximas caracter\u00edsticas de PHP? \u00bfCu\u00e1l es tu favorita? Deja una l\u00ednea en la secci\u00f3n de comentarios abajo.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Se espera que PHP 8 sea lanzado en diciembre de 2020 y nos traer\u00e1 un mont\u00f3n de caracter\u00edsticas poderosas y grandes mejoras en el lenguaje. Ya &#8230;<\/p>\n","protected":false},"author":36,"featured_media":33625,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[432,414],"topic":[1317],"class_list":["post-33620","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-php","tag-webdev","topic-actualizaciones-php"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u00bfQu\u00e9 hay de nuevo en PHP 8? Mejoras, caracter\u00edsticas y compilador JIT.<\/title>\n<meta name=\"description\" content=\"Se espera que PHP 8 sea liberado el 3 de diciembre de 2020. Traer\u00e1 nuevas caracter\u00edsticas, aumento del rendimiento. \u00a1Revisa lo nuevo en PHP 8!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/es\/blog\/php-8\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u00bfQu\u00e9 hay de nuevo en PHP 8? (Caracter\u00edsticas, mejoras y el Compilador JIT )\" \/>\n<meta property=\"og:description\" content=\"Se espera que PHP 8 sea liberado el 3 de diciembre de 2020. Traer\u00e1 nuevas caracter\u00edsticas, aumento del rendimiento. \u00a1Revisa lo nuevo en PHP 8!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/es\/blog\/php-8\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinsta.es\/\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-26T10:04:44+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-02-17T14:22:34+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/nuevo-php8.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"512\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Carlo Daniele\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Se espera que PHP 8 sea liberado el 3 de diciembre de 2020. Traer\u00e1 nuevas caracter\u00edsticas, aumento del rendimiento. \u00a1Revisa lo nuevo en PHP 8!\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/nuevo-php8.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@carlodaniele\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_ES\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Carlo Daniele\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"24 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/php-8\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/php-8\/\"},\"author\":{\"name\":\"Carlo Daniele\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\"},\"headline\":\"\u00bfQu\u00e9 hay de nuevo en PHP 8? (Caracter\u00edsticas, mejoras y el Compilador JIT )\",\"datePublished\":\"2020-05-26T10:04:44+00:00\",\"dateModified\":\"2025-02-17T14:22:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/php-8\/\"},\"wordCount\":4732,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/php-8\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/nuevo-php8.jpg\",\"keywords\":[\"php\",\"webdev\"],\"articleSection\":[\"Desarrollo de WordPress\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/php-8\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/php-8\/\",\"url\":\"https:\/\/kinsta.com\/es\/blog\/php-8\/\",\"name\":\"\u00bfQu\u00e9 hay de nuevo en PHP 8? Mejoras, caracter\u00edsticas y compilador JIT.\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/php-8\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/php-8\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/nuevo-php8.jpg\",\"datePublished\":\"2020-05-26T10:04:44+00:00\",\"dateModified\":\"2025-02-17T14:22:34+00:00\",\"description\":\"Se espera que PHP 8 sea liberado el 3 de diciembre de 2020. Traer\u00e1 nuevas caracter\u00edsticas, aumento del rendimiento. \u00a1Revisa lo nuevo en PHP 8!\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/php-8\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/php-8\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/php-8\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/nuevo-php8.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/nuevo-php8.jpg\",\"width\":1024,\"height\":512,\"caption\":\"Qu\u00e9 hay de nuevo en PHP 8 (Caracter\u00edsticas, mejoras y el compilador JIT)\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/php-8\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/es\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Actualizaciones de PHP\",\"item\":\"https:\/\/kinsta.com\/es\/secciones\/actualizaciones-php\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"\u00bfQu\u00e9 hay de nuevo en PHP 8? (Caracter\u00edsticas, mejoras y el Compilador JIT )\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/es\/#website\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluciones de alojamiento premium, r\u00e1pidas y seguras\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/es\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/es\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinsta.es\/\",\"https:\/\/x.com\/Kinsta_ES\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\",\"name\":\"Carlo Daniele\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"caption\":\"Carlo Daniele\"},\"description\":\"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.\",\"sameAs\":[\"https:\/\/frammentidicodice.com\/\",\"https:\/\/x.com\/carlodaniele\"],\"url\":\"https:\/\/kinsta.com\/es\/blog\/author\/carlodaniele\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u00bfQu\u00e9 hay de nuevo en PHP 8? Mejoras, caracter\u00edsticas y compilador JIT.","description":"Se espera que PHP 8 sea liberado el 3 de diciembre de 2020. Traer\u00e1 nuevas caracter\u00edsticas, aumento del rendimiento. \u00a1Revisa lo nuevo en PHP 8!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/es\/blog\/php-8\/","og_locale":"es_ES","og_type":"article","og_title":"\u00bfQu\u00e9 hay de nuevo en PHP 8? (Caracter\u00edsticas, mejoras y el Compilador JIT )","og_description":"Se espera que PHP 8 sea liberado el 3 de diciembre de 2020. Traer\u00e1 nuevas caracter\u00edsticas, aumento del rendimiento. \u00a1Revisa lo nuevo en PHP 8!","og_url":"https:\/\/kinsta.com\/es\/blog\/php-8\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinsta.es\/","article_published_time":"2020-05-26T10:04:44+00:00","article_modified_time":"2025-02-17T14:22:34+00:00","og_image":[{"width":1024,"height":512,"url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/nuevo-php8.jpg","type":"image\/jpeg"}],"author":"Carlo Daniele","twitter_card":"summary_large_image","twitter_description":"Se espera que PHP 8 sea liberado el 3 de diciembre de 2020. Traer\u00e1 nuevas caracter\u00edsticas, aumento del rendimiento. \u00a1Revisa lo nuevo en PHP 8!","twitter_image":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/nuevo-php8.jpg","twitter_creator":"@carlodaniele","twitter_site":"@Kinsta_ES","twitter_misc":{"Escrito por":"Carlo Daniele","Tiempo de lectura":"24 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/es\/blog\/php-8\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/blog\/php-8\/"},"author":{"name":"Carlo Daniele","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63"},"headline":"\u00bfQu\u00e9 hay de nuevo en PHP 8? (Caracter\u00edsticas, mejoras y el Compilador JIT )","datePublished":"2020-05-26T10:04:44+00:00","dateModified":"2025-02-17T14:22:34+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/php-8\/"},"wordCount":4732,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/php-8\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/nuevo-php8.jpg","keywords":["php","webdev"],"articleSection":["Desarrollo de WordPress"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/es\/blog\/php-8\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/es\/blog\/php-8\/","url":"https:\/\/kinsta.com\/es\/blog\/php-8\/","name":"\u00bfQu\u00e9 hay de nuevo en PHP 8? Mejoras, caracter\u00edsticas y compilador JIT.","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/php-8\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/php-8\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/nuevo-php8.jpg","datePublished":"2020-05-26T10:04:44+00:00","dateModified":"2025-02-17T14:22:34+00:00","description":"Se espera que PHP 8 sea liberado el 3 de diciembre de 2020. Traer\u00e1 nuevas caracter\u00edsticas, aumento del rendimiento. \u00a1Revisa lo nuevo en PHP 8!","breadcrumb":{"@id":"https:\/\/kinsta.com\/es\/blog\/php-8\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/es\/blog\/php-8\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/blog\/php-8\/#primaryimage","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/nuevo-php8.jpg","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2020\/05\/nuevo-php8.jpg","width":1024,"height":512,"caption":"Qu\u00e9 hay de nuevo en PHP 8 (Caracter\u00edsticas, mejoras y el compilador JIT)"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/es\/blog\/php-8\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/es\/"},{"@type":"ListItem","position":2,"name":"Actualizaciones de PHP","item":"https:\/\/kinsta.com\/es\/secciones\/actualizaciones-php\/"},{"@type":"ListItem","position":3,"name":"\u00bfQu\u00e9 hay de nuevo en PHP 8? (Caracter\u00edsticas, mejoras y el Compilador JIT )"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/es\/#website","url":"https:\/\/kinsta.com\/es\/","name":"Kinsta\u00ae","description":"Soluciones de alojamiento premium, r\u00e1pidas y seguras","publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/es\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinsta.es\/","https:\/\/x.com\/Kinsta_ES","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63","name":"Carlo Daniele","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","caption":"Carlo Daniele"},"description":"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.","sameAs":["https:\/\/frammentidicodice.com\/","https:\/\/x.com\/carlodaniele"],"url":"https:\/\/kinsta.com\/es\/blog\/author\/carlodaniele\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/33620","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/users\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/comments?post=33620"}],"version-history":[{"count":14,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/33620\/revisions"}],"predecessor-version":[{"id":41078,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/33620\/revisions\/41078"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/33620\/translations\/en"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/33620\/translations\/es"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/33620\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/33620\/translations\/pt"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/33620\/translations\/jp"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/33620\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/33620\/translations\/de"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/33620\/translations\/nl"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/33620\/translations\/dk"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/33620\/translations\/se"},{"href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/33620\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media\/33625"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media?parent=33620"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/tags?post=33620"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/topic?post=33620"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}