{"id":4287,"date":"2020-12-11T11:47:56","date_gmt":"2020-12-11T10:47:56","guid":{"rendered":"https:\/\/www.lucushost.com\/blog\/?p=4287"},"modified":"2021-05-26T12:55:10","modified_gmt":"2021-05-26T11:55:10","slug":"php-8","status":"publish","type":"post","link":"https:\/\/www.lucushost.com\/blog\/php-8\/","title":{"rendered":"PHP 8: Lanzamiento, caracter\u00edsticas y mejoras"},"content":{"rendered":"<p>El pasado 26 de noviembre el equipo de desarrollo de PHP lanz\u00f3 una actualizaci\u00f3n mayor del lenguaje de programaci\u00f3n m\u00e1s utilizado en el mundo web: <strong>PHP 8<\/strong>.<\/p>\n<p><!--more--><\/p>\n<p>Al tratarse de una actualizaci\u00f3n mayor, PHP 8 incorpora cambios muy importantes, especialmente mejoras en cuanto a <strong>rendimiento, velocidad y seguridad<\/strong>.<\/p>\n<p>Y un lanzamiento tan importante no merece menos que un art\u00edculo completo para desgranar todas las funcionalidades y caracter\u00edsticas que\u00a0 veremos en esta nueva versi\u00f3n.<\/p>\n<p>\u00bfVamos a ello?<\/p>\n<div id=\"toc_container\" class=\"no_bullets\"><p class=\"toc_title\">Tabla de contenidos:<\/p><ul class=\"toc_list\"><li><a href=\"#Caracteristicas_y_mejoras_de_PHP_8\">Caracter\u00edsticas y mejoras de PHP 8<\/a><ul><li><a href=\"#Compilador_JIT\">Compilador JIT<\/a><\/li><li><a href=\"#Union_Types_o_Tipos_de_union\">Union Types o Tipos de uni\u00f3n<\/a><\/li><li><a href=\"#Match_expression\">Match expression<\/a><\/li><li><a href=\"#Attributes_o_atributos\">Attributes o atributos<\/a><\/li><li><a href=\"#Weak_Maps\">Weak Maps<\/a><\/li><li><a href=\"#Constructor_Property_Promotion\">Constructor Property Promotion<\/a><\/li><li><a href=\"#Uso_de_class_en_los_objetos\">Uso de ::class en los objetos<\/a><\/li><li><a href=\"#Stringable_interface_o_interfaz_para_cadenas\">Stringable interface o interfaz para cadenas<\/a><\/li><li><a href=\"#Type_errors_o_errores_de_tipo\">Type errors o errores de tipo<\/a><\/li><li><a href=\"#Named_arguments_o_argumentos_de_nombre\">Named arguments o argumentos de nombre<\/a><\/li><\/ul><\/li><li><a href=\"#Y_que_ocurre_con_mi_version_actual_de_PHP\">\u00bfY qu\u00e9 ocurre con mi versi\u00f3n actual de PHP?<\/a><\/li><li><a href=\"#PHP_8_ya_disponible_en_nuestros_servidores\">PHP 8 ya disponible en nuestros servidores<\/a><\/li><\/ul><\/div>\n\n<h2><span id=\"Caracteristicas_y_mejoras_de_PHP_8\">Caracter\u00edsticas y mejoras de PHP 8<\/span><\/h2>\n<p>PHP se ha modernizado, es un hecho. Como ya te he adelantado, esta \u00faltima actualizaci\u00f3n de PHP 8 promete muchas mejoras en cuanto a rendimiento y seguridad.<\/p>\n<p>Yo en este post voy a mostrarte las m\u00e1s significativas (tampoco quiero aburrir \ud83d\ude05 ), pero en la <a href=\"https:\/\/www.php.net\/releases\/8.0\/en.php\" rel=\"nofollow noopener\" target=\"_blank\"><strong>p\u00e1gina oficial de PHP<\/strong><\/a> tienes toda la informaci\u00f3n, as\u00ed como los RFC que han hecho posible el lanzamiento de esta nueva versi\u00f3n.<\/p>\n<h3><span id=\"Compilador_JIT\">Compilador JIT<\/span><\/h3>\n<p>Una de las mayores novedades que incorpora la \u00faltima versi\u00f3n de PHP es el <strong>compilador JIT<\/strong> (<i>Just in Time Compiler<\/i>). Esta nueva funcionalidad, que ya estuvo a punto de lanzarse con PHP 7.4, supone un gran cambio en este lenguaje de programaci\u00f3n prometiendo <strong>grandes mejoras en cuanto a rendimiento.<\/strong><\/p>\n<p>Como sabes, PHP est\u00e1 equipado con una m\u00e1quina virtual llamada Zend VM encargada de leer y ejecutar el c\u00f3digo PHP, pero para que esto sea posible es necesario que Opcode lea y traduzca ese c\u00f3digo en el lenguaje de Zend VM.<\/p>\n<p>Por tanto, para que se ejecute PHP necesitamos dos cosas:<\/p>\n<ul>\n<li>Un traductor (Opcode)<\/li>\n<li>M\u00e1quina que lo ejecute (Zend VM)<\/li>\n<\/ul>\n<p>Para que este proceso sea lo m\u00e1s r\u00e1pido posible, Opcode utiliza OPCache (Opcode Cache), almacenando los resultados de la fase de compilaci\u00f3n para no tener as\u00ed que volver a compilar.<\/p>\n<p>Con JIT este funcionamiento cambia completamente. Este componente se encarga de <strong>compilar el c\u00f3digo en el momento de ejecuci\u00f3n<\/strong> y ya no es necesario un traductor que lo env\u00ede a Zend VM. \u00bfQu\u00e9 significa esto? Que se elimina un paso intermedio y la ejecuci\u00f3n del c\u00f3digo se hace de forma m\u00e1s r\u00e1pida. Especialmente beneficioso para aplicaciones que consumen mucha CPU.<\/p>\n<p>Por defecto, este componente de PHP vendr\u00e1 desactivado, pero puede habilitarse f\u00e1cilmente <a href=\"https:\/\/www.lucushost.com\/ayuda\/configurar-php-ini-en-cpanel\/\"><strong>modificando el archivo php.ini<\/strong><\/a> de tu plan de hosting.<\/p>\n<h3><span id=\"Union_Types_o_Tipos_de_union\">Union Types o Tipos de uni\u00f3n<\/span><\/h3>\n<p>Hasta la versi\u00f3n de PHP 8 no se admiten tipos de uni\u00f3n arbitrarios, \u00fanicamente son v\u00e1lidos dos tipos de uni\u00f3n especiales:<\/p>\n<ul>\n<li><em>Type<\/em> o <em>null<\/em>, utilizando la sintaxis <i>?Type<\/i><\/li>\n<li><em>Array<\/em> o <em>Traversable<\/em>, utilizando <i>iterable type<\/i><\/li>\n<\/ul>\n<p>Y, como alternativa, se deb\u00edan utilizar anotaciones <i>phpdoc <\/i>como las que se muestran en este ejemplo del RFC:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">class Number {\r\n    \/**\r\n     * @var int|float $number\r\n     *\/\r\n    private $number;\r\n \r\n    \/**\r\n     * @param int|float $number\r\n     *\/\r\n    public function setNumber($number) {\r\n        $this-&gt;number = $number;\r\n    }\r\n \r\n    \/**\r\n     * @return int|float\r\n     *\/\r\n    public function getNumber() {\r\n        return $this-&gt;number;\r\n    }\r\n}<\/pre>\n<p>Debido a que el uso de tipos de uni\u00f3n est\u00e1 muy extendido en el \u00e1mbito <i>open source<\/i> y tambi\u00e9n en la librer\u00eda de PHP, la nueva versi\u00f3n de PHP 8 tendr\u00e1 soporte para los tipos de uni\u00f3n en las firmas de las funciones, permitiendo as\u00ed ahorrar bastante c\u00f3digo.<\/p>\n<p>Estos tipos de uni\u00f3n se especifican utilizando la sintaxis <i>T1 | T2 |<\/i>. Por ejemplo:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">class Number {\r\n    private int|float $number;\r\n \r\n    public function setNumber(int|float $number): void {\r\n        $this-&gt;number = $number;\r\n    }\r\n \r\n    public function getNumber(): int|float {\r\n        return $this-&gt;number;\r\n    }\r\n}<\/pre>\n<p>Eso s\u00ed, aunque se admiten todos los tipos de uni\u00f3n, hay algunas limitaciones:<\/p>\n<ul>\n<li><em>Void type<\/em>: El tipo void indica que la funci\u00f3n no tiene valor de retorno, por lo que no puede formar parte de una uni\u00f3n.<\/li>\n<li><em>Nullable<\/em> union types: El tipo nulo se admite como parte de las uniones, pero no se puede utilizar de forma independiente. Tampoco se pueden combinar los tipos de uni\u00f3n y la notaci\u00f3n de tipos que aceptan valores<i> NULL? T<\/i>. Es decir, no se permite utilizar <i>T1 | T2, T1 |? T2<\/i> o<i>? (T1 | T2)<\/i>, s ino que deber\u00eda ser <i>T1 | T2 | null<\/i>.<\/li>\n<li>Pseudo-tipo <em>false<\/em>: PHP 8 tiene soporte para el pseudo-tipo <i>false<\/i>, aunque no se puede utilizar como un tipo independiente.<\/li>\n<li>Tipos redundantes y duplicados: sin realizar la carga de clases, se detectan tipos redundantes o duplicados generar\u00e1n un error en el tiempo de compilaci\u00f3n.<\/li>\n<\/ul>\n<h3><span id=\"Match_expression\">Match expression<\/span><\/h3>\n<p>PHP 8 incorpora una nueva extensi\u00f3n similar a <i>switch<\/i>, pero con tres grandes diferencias.<\/p>\n<ul>\n<li>M\u00e1s segura: los valores se comparan estrictamente\u00a0 <i>(===)<\/i>, en lugar de la verificaci\u00f3n de igualdad de las expresiones <i>switch (==)<\/i>.<\/li>\n<li>Devuelve valores: A diferencia de las expresiones <i>switch<\/i>, las expresiones de coincidencia o <i>match expressions<\/i> s\u00ed devuelven valores.<\/li>\n<\/ul>\n<h3><span id=\"Attributes_o_atributos\">Attributes o atributos<\/span><\/h3>\n<p>A partir de la versi\u00f3n 8 de PHP ser\u00e1 posible a\u00f1adir atributos, es decir, anotaciones (meta datos) sin tener que utilizar bloques de comentarios.<\/p>\n<p>Para ello, ser\u00e1 necesario crear un atributo, como si fuese una clase, con el formato <strong>&lt;&lt;<\/strong> <strong>&gt;&gt;<\/strong>, reutilizando los tokens existentes <i>T_SL<\/i> y <i>T_SR<\/i>. Tal y como se establece en el RFC, un ejemplo de atributo se ver\u00eda as\u00ed:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">namespace My\\Attributes;\r\n \r\nuse PhpAttribute;\r\n \r\n&lt;&lt;PhpAttribute&gt;&gt;\r\nclass SingleArgument\r\n{\r\n    public $value;\r\n \r\n    public function __construct(string $value)\r\n    {\r\n        $this-&gt;value = $value;\r\n    }\r\n}<\/pre>\n<h3><span id=\"Weak_Maps\">Weak Maps<\/span><\/h3>\n<p>Basados en las <i>Weak References<\/i> de PHP 7.4, en PHP 8 se introducen los <i>Weak Maps<\/i>, que permiten crear un mapa de objetos a valores arbitrarios sin evitar que esos objetos sean eliminados por el <i>garbage collector<\/i>.<\/p>\n<p>El hecho de que los objetos de un <i>Weak Map<\/i> se puedan recolectar como basura puede ser muy interesante para librer\u00edas encargadas de cachear objetos, ya que permiten liberar memoria de forma m\u00e1s eficiente cuando ya no haya nada m\u00e1s que haga referencia a ellos.<\/p>\n<p>Un ejemplo de <i>Weak Map<\/i> recogido por el RFC para un resultado de c\u00e1lculo ser\u00eda el siguiente:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">class FooBar {\r\n    private WeakMap $cache;\r\n \r\n    public function getSomethingWithCaching(object $obj) {\r\n        return $this-&gt;cache[$obj] ??= $this-&gt;computeSomethingExpensive($obj);\r\n    }\r\n \r\n    \/\/ ...\r\n}<\/pre>\n<h3><span id=\"Constructor_Property_Promotion\">Constructor Property Promotion<\/span><\/h3>\n<p>Esta funcionalidad de PHP 8 permite simplificar el c\u00f3digo que escribimos por versiones m\u00e1s cortas. Esto permite tener un c\u00f3digo mucho m\u00e1s limpio, legible y simple.<\/p>\n<p>Tal y como se establece en el RFC, podr\u00edamos pasar de esta forma:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">class Point {\r\n    public float $x;\r\n    public float $y;\r\n    public float $z;\r\n \r\n    public function __construct(\r\n        float $x = 0.0,\r\n        float $y = 0.0,\r\n        float $z = 0.0,\r\n    ) {\r\n        $this-&gt;x = $x;\r\n        $this-&gt;y = $y;\r\n        $this-&gt;z = $z;\r\n    }\r\n}<\/pre>\n<p>A esta otra:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">class Point {\r\n    public function __construct(\r\n        public float $x = 0.0,\r\n        public float $y = 0.0,\r\n        public float $z = 0.0,\r\n    ) {}\r\n}<\/pre>\n<p>Estas dos formas equivalen exactamente a lo mismo, pero es mucho m\u00e1s concisa y f\u00e1cil de interpretar, \u00bfverdad?<\/p>\n<h3><span id=\"Uso_de_class_en_los_objetos\">Uso de ::class en los objetos<\/span><\/h3>\n<p>Otra forma de sintetizar el c\u00f3digo es aplicando directamente :<i>:class<\/i> a los objetos en lugar de <i>get_class()<\/i>, como hasta ahora.<\/p>\n<h3><span id=\"Stringable_interface_o_interfaz_para_cadenas\">Stringable interface o interfaz para cadenas<\/span><\/h3>\n<p>Otra de las mejoras de PHP 8 es la implementaci\u00f3n autom\u00e1tica de <i>Stringable interface <\/i>a las clases que implementan el m\u00e9todo <i>__toString()<\/i>, sin necesidad de hacerlo a mano.<\/p>\n<h3><span id=\"Type_errors_o_errores_de_tipo\">Type errors o errores de tipo<\/span><\/h3>\n<p>Hasta PHP 8, solo las funciones definidas por el usuario arrojaban los <i>TypeErrors<\/i>, las funciones internas emit\u00edan advertencias y devolv\u00edan el valor <i>null<\/i>. Ahora, el comportamiento de estas funciones<\/p>\n<h3><span id=\"Named_arguments_o_argumentos_de_nombre\">Named arguments o argumentos de nombre<\/span><\/h3>\n<p>Los <i>Named arguments<\/i> permiten pasar datos de entrada a una funci\u00f3n con el nombre del par\u00e1metro, en vez de hacerlo con su posici\u00f3n.<\/p>\n<p>Esto hace que los <i>Name arguments<\/i> sean independientes del orden y tambi\u00e9n permite omitir valores predeterminados de forma aleatoria. Por ejemplo:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\/\/ Utilizando argumentos de posici\u00f3n:\r\narray_fill(0, 100, 50);<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\/\/ Utilizando argumentos de nombre:\r\narray_fill(start_index: 0, num: 100, value: 50);<\/pre>\n<p>De esta forma, el orden en el que se establecen los argumentos no es decisivo, sino que se podr\u00edan utilizar en cualquier otra posici\u00f3n:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">array_fill(value: 50, num: 100, start_index: 0);<\/pre>\n<p>Adem\u00e1s, tambi\u00e9n es posible combinar argumentos de nombre con argumentos de posici\u00f3n o especificar \u00fanicamente los que necesites, independientemente del orden en c\u00f3mo los establezcas:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">htmlspecialchars($string, double_encode: false);\r\n\/\/ Same as\r\nhtmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);<\/pre>\n<h2><span id=\"Y_que_ocurre_con_mi_version_actual_de_PHP\">\u00bfY qu\u00e9 ocurre con mi versi\u00f3n actual de PHP?<\/span><\/h2>\n<p>Seguro que no es la primera vez que te lo decimos, es muy importante trabajar con las versiones m\u00e1s recientes de un software. Normalmente, cuando se liberan actualizaciones, se corrigen problemas de seguridad que podr\u00edan afectar a tu proyecto.<\/p>\n<p>Por tanto, <strong>no es nada recomendable que a d\u00eda de hoy trabajes con una versi\u00f3n obsoleta de PHP<\/strong>. De hecho, una de las versiones m\u00e1s utilizadas en la actualidad, PHP 7.1, ya no tiene soporte y PHP 7.2 hace pocos d\u00edas que lo dio por finalizado. As\u00ed que, es importante actualizarlo.<\/p>\n<p>Por no hablar de esas webs o aplicaciones que utilizan versiones como la 5.4 o 5.5\u2026<\/p>\n<p>Si utilizas<strong> PHP 7.3 o 7.4<\/strong>, no tienes de qu\u00e9 preocuparte. Por el momento hay soporte para estas versiones, aunque tampoco es recomendable alargar estas versiones durante mucho m\u00e1s tiempo.<\/p>\n<p>Una de las cosas que debes tener en cuenta si quieres cambiar la versi\u00f3n de PHP con la que trabaja tu web, es que algunas de las caracter\u00edsticas puede que no sean compatibles. Eso s\u00ed, si has mantenido el c\u00f3digo actualizado, no deber\u00edas tener problema.<\/p>\n<h2><span id=\"PHP_8_ya_disponible_en_nuestros_servidores\">PHP 8 ya disponible en nuestros servidores<\/span><\/h2>\n<p>Ya sabes que en LucusHost trabajamos con la \u00faltima tecnolog\u00eda y mantenemos todo al d\u00eda, as\u00ed que&#8230; \u00a1Ya est\u00e1 disponible PHP 8 en todos nuestros planes de <a href=\"\/hosting-ssd\"><strong>hosting<\/strong><\/a>!<\/p>\n<p>Esto no quiere decir que vayamos a actualizar tu aplicaci\u00f3n autom\u00e1ticamente (ni mucho menos), solo queremos que tengas la posibilidad de elegir la versi\u00f3n de PHP que t\u00fa quieras. Si no sabes muy bien c\u00f3mo hacerlo o necesitas ayuda, estas dos gu\u00edas te vendr\u00e1n de perlas:<\/p>\n<ul>\n<li><strong><a href=\"https:\/\/www.lucushost.com\/ayuda\/como-cambiar-la-version-de-php-en-cpanel\/\">C\u00f3mo cambiar la versi\u00f3n de PHP en cPanel<\/a> <\/strong><\/li>\n<li><strong><a href=\"https:\/\/www.lucushost.com\/blog\/actualizar-php-wordpress\/\">C\u00f3mo actualizar PHP de WordPress<\/a><\/strong><\/li>\n<\/ul>\n<p>\u00bfAlguna duda a la hora de seleccionar PHP 8? Nuestro equipo de soporte t\u00e9cnico est\u00e1 disponible 24&#215;7 para echarte una mano en todo lo que necesites \ud83d\ude42 .<\/p>\n","protected":false},"excerpt":{"rendered":"<p>El pasado 26 de noviembre el equipo de desarrollo de PHP lanz\u00f3 una actualizaci\u00f3n mayor del lenguaje de programaci\u00f3n m\u00e1s utilizado en el mundo web: PHP 8.<\/p>\n","protected":false},"author":3,"featured_media":4466,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[45],"tags":[],"_links":{"self":[{"href":"https:\/\/www.lucushost.com\/blog\/wp-json\/wp\/v2\/posts\/4287"}],"collection":[{"href":"https:\/\/www.lucushost.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lucushost.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lucushost.com\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lucushost.com\/blog\/wp-json\/wp\/v2\/comments?post=4287"}],"version-history":[{"count":14,"href":"https:\/\/www.lucushost.com\/blog\/wp-json\/wp\/v2\/posts\/4287\/revisions"}],"predecessor-version":[{"id":13504,"href":"https:\/\/www.lucushost.com\/blog\/wp-json\/wp\/v2\/posts\/4287\/revisions\/13504"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lucushost.com\/blog\/wp-json\/wp\/v2\/media\/4466"}],"wp:attachment":[{"href":"https:\/\/www.lucushost.com\/blog\/wp-json\/wp\/v2\/media?parent=4287"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lucushost.com\/blog\/wp-json\/wp\/v2\/categories?post=4287"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lucushost.com\/blog\/wp-json\/wp\/v2\/tags?post=4287"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}