Introducción A PHP 7: Qué Hay De Nuevo Y Qué Se Ha Ido
Uno de los eventos más emocionantes en el 2015 en el mundo de PHP fue el lanzamiento de PHP 7;10 años después del lanzamiento de la última versión principal, PHP 5. Con un gran paso adelante, PHP 7 introduce un montón de nuevas características y actualizaciones de rendimiento.
Sin embargo, también elimina la funcionalidad antigua, obsoleta, que introduce algunos pausas de compatibilidad, lo que hace más difícil para las aplicaciones más antiguas migrar a la nueva versión. Esta guía debe servir como un recorrido rápido sobre qué esperar si planeas mover sus aplicaciones existentes, o construir otras nuevas, encima de PHP 7.
Pero Espera, ¿ A Dónde Fue PHP 6?
Si no has estado trabajando con PHP últimamente, puedes preguntarte qué pasó con PHP 6, ¿por qué el salto de PHP 5 a PHP 7? Bueno, larga historia corta, PHP 6 fue un fracaso. La característica principal de la versión 6 era el soporte nativo de caracteres Unicode, ya que PHP se utiliza principalmente en el desarrollo web y la web necesita Unicode, por lo que el movimiento para traer Unicode a PHP tenía sentido.
La idea era traer un soporte completo para Unicode al núcleo mismo. Habría traído capacidades extendidas al lenguaje: desde la habilidad de usar emojis tontos, como nombres de variables y de funciones, hasta poderosas funciones internacionales de cuerdas. Por ejemplo, cuando otro idioma utiliza letras mayúsculas y minúsculas de manera diferente al inglés, o cuando un nombre en caracteres chinos necesita ser convertido al inglés.
Desafortunadamente, este ambicioso plan resultó ser un mayor problema de lo previsto. La mayor parte de la base de código tenía que ser portada para soportar Unicode tanto para las extensiones principales como para las importantes, lo que resultó tedioso y complicado. Esto frenó el desarrollo de otras características en el lenguaje, frustrando a muchos desarrolladores de PHP en el proceso. Se presentaron obstáculos adicionales, lo que resultó en menos interés en el desarrollo de un soporte nativo de Unicode, lo que finalmente llevó al abandono del proyecto.
Dado que los recursos, tales como libros y artículos, se habían escrito para PHP 6 y su soporte Unicode, la nueva versión sería renombrada PHP 7 para evitar la confusión.
De todos modos, suficiente sufrimiento del pasado triste, vamos a ver lo que PHP 7 trae a la fiesta.
Batalla De Rendimiento, PHP 7 vs. PHP 5
Con prácticamente todas las actualizaciones, se esperan mejoras de rendimiento menores. Sin embargo, esta vez PHP trae una mejora significativa sobre versiones anteriores que hacen el funcionamiento escarpado una de las características más atractivas de PHP 7. Esto viene como parte del proyecto “PHPNG”, que aborda los componentes internos del propio motor Zend.
Mediante la refactorización de estructuras de datos internas y la adición de un paso intermedio para codificar la compilación en forma de un árbol de sintaxis abstracto (AST), el resultado es un rendimiento superior y una asignación de memoria más eficiente. Los números mismos parecen muy prometedores; Los Benchmarks realizados en aplicaciones del mundo real muestran que PHP 7 es dos veces más rápido que PHP 5.6 en promedio y que resulta en un 50% menos de consumo de memoria durante las solicitudes, convirtiendo a PHP 7 en un fuerte rival para el compilador HHVM JIT de Facebook. Echa un vistazo a este infográfico de Zend representando el rendimiento de algunos comunes CMS y Frameworks.
La disminución en el consumo de memoria también permite a las máquinas más pequeñas manejar mejor las solicitudes junto con la oportunidad de construir micro servicios alrededor de PHP. Los cambios internos, en particular la implementación de AST, también abren posibilidades de optimizaciones futuras que podrían empujar aún más el rendimiento. Se está considerando una nueva implementación interna de un compilador JIT para futuras versiones.
PHP 7 Azúcar Sintáctica
PHP 7 viene con nuevas características de sintaxis. Aunque no amplían las capacidades del propio lenguaje, proporcionan una forma mejor o más fácil de hacer que tu código sea más agradable para escribir y más cómodo para a los ojos.
Declaraciones De Importación De Grupo
Ahora, podemos agrupar las declaraciones de importación para las clases que se originan desde el mismo espacio de nombres en la línea de ‘uso.’ Esto debería ayudar a alinear las declaraciones de una manera significativa o simplemente guardar algunos bytes en tus archivos.
use Framework\Module\Foo; use Framework\Module\Bar; use Framework\Module\Baz;
Con PHP 7 podemos usar:
use Framework\Module\{Foo, Bar, Baz};
O si preferimos un estilo multi-linear:
use Framework\Module{ Foo, Bar, Baz };
Operador Coalescente Nulo
Esto resuelve un problema común en la programación PHP, donde queremos asignar un valor a una variable de otra variable, si esta última está realmente configurada; de lo contrario proporcionarle un valor diferente a esta. Se utiliza comúnmente cuando trabajamos con la entrada proporcionada por el usuario.
Pre-PHP 7:
if (isset($foo)) { $bar = $foo; } else { $bar = 'default'; // we would give $bar the value 'default' if $foo is NULL }
Después de PHP 7:
$bar = $foo ?? 'default';
Esto también puede estar encadenado con un número de variables:
$bar = $foo ?? $baz ?? 'default';
Operador De Nave Espacial
El operador de la nave espacial <=> permite una comparación de tres vías entre dos valores, no solo indicando si son iguales, sino también cuál es mayor, sobre la desigualdad devolviendo 1,0 o -1.
Aquí podemos tomar diferentes acciones dependiendo de cómo los valores difieren:
switch ($bar <=> $foo) { case 0: echo '$bar and $foo are equal'; case -1: echo '$foo is bigger'; case 1: echo '$bar is bigger'; }
Los valores comparados pueden ser enteros, flotantes, cadenas o incluso matrices. Consulta la documentación para tener una idea de cómo se comparan los diferentes valores entre sí.
Nuevas Funciones En PHP 7
Pero, por supuesto, PHP 7 también aporta nuevas y emocionantes funcionalidades.
Tipos De Parámetros Escalares Y Sugerencias De Tipo De Retorno
PHP 7 extiende las declaraciones de tipos anteriores de parámetros en métodos (clases, interfaces y matrices) añadiendo los cuatro tipos escalares; Integers (int), Floats (float), Booleans (bool) y Strings (string) como posibles tipos de parámetro.
Además, podemos especificar opcionalmente qué tipo de métodos y funciones devuelven. Los tipos soportados son * bool *, * int *, * float *, * string *, * array *, * callable *, nombre de * Clase * o * Interface *, * self * y * parent * (para métodos de clase)
Clase Calculadora { // Declaramos que los parámetros proporcionados son del tipo entero Función Pública addTwoInts (int $ x, int $ y): int { Retorno $ x + $ y; // También decimos explícitamente que este método devolverá un entero } }
Las declaraciones de tipo permiten la construcción de aplicaciones más robustas y evitan pasar y devolver valores erróneos de las funciones. Otros beneficios incluyen analizadores de código estático e IDEs, que proporcionan una mejor visión de la base de código si faltan los DocBlocks.
Dado que PHP es un lenguaje de tipificación débil, ciertos valores para los tipos de parámetro y de retorno se emitirán en función del contexto. Si pasamos el valor “3” en una función que tiene un parámetro declarado de tipo int, el intérprete lo aceptará como un entero y no lanzará ningún error. Si no deseas esto, puede habilitar modo estricto añadiendo una directiva dedeclarar.
Declarar (tipos_estrictos = 1);
Esto se establece en una base por archivo, ya que una opción global dividiría los repositorios de código en aquellos que están construidos con rigor global en y aquellos que no lo son, resultando en un comportamiento inesperado cuando combinamos código de ambos.
Excepciones Del Motor
Con la adición de excepciones del motor, los errores fatales que podrían haber resultado en la terminación del Script se pueden capturar y manejar fácilmente.
Errores como llamar a un método inexistente no terminará el Script, sino que lanzarán una excepción que puede ser manejada por un bloque de prueba de captura, lo que mejora el manejo de errores para sus aplicaciones. Esto es importante para ciertos tipos de aplicaciones, servidores y Daemons, ya que los errores fatales requerirían que se reinician. Las pruebas en PHPUnit también deberían ser más útiles, ya que los errores fatales eliminan toda la serie de pruebas. Las excepciones, en lugar de errores, se manejaría por caso de prueba.
PHP 7 añade una serie de nuevas clases de excepción basadas en el tipo de errores que se pueden encontrar. Con el fin de mantener la compatibilidad entre versiones, se ha añadido una nueva interfaz Throwable que se puede implementar a partir de excepciones de motor y de usuario. Esto era necesario para evitar excepciones del motor para extender la clase de excepción de base, lo que resulta en antiguas excepciones de captura de código que no existían antes.
Antes de PHP 7 esto habría terminado el script con un error fatal:
try { thisFunctionDoesNotEvenExist(); } catch (\EngineException $e) { // Clean things up and log error echo $e->getMessage(); }
Clases Anónimas
Las clases anónimas son primos de funciones anónimas que podrías usar en una instancia simple a corto plazo. Las clases anónimas se pueden crear y utilizar fácilmente como un objeto normal. Aquí hay un ejemplo de los documentos.
Pre-PHP 7
php class MyLogger { public function log($msg) { print_r($msg . "\n"); } } $pusher->setLogger( new MyLogger() );
Con clase anónima:
php $pusher->setLogger(new class { public function log($msg) { print_r($msg . "\n"); } });
Las clases anónimas son útiles en las pruebas unitarias, particularmente en pruebas de objetos y servicios. Esto nos ayuda a evitar las pesadas bibliotecas y los marcos replica la creación de un objeto simple que proporciona la interfaz que queremos imitar.
Funciones CSPRNG
Se agregaron dos nuevas funciones para generar cadenas y números enteros criptográficamente seguros.
random_bytes(int $len);
Devuelve una cadena aleatoria con longitud $len.
php random_int(int $min, int $max);
Devuelve un número entre $miny $max.
Sintaxis de Escape de Codepoint Unicode
A diferencia de muchos otros lenguajes, antes de PHP 7, PHP no tenía una manera de escapar de un código Unicode en literales de cadena,. Esta funcionalidad agrega la secuencia de escape `\ u ‘para producir dichos caracteres usando su código de código UTF-8. Esto es mejor que insertar los caracteres directamente, permitiendo un mejor manejo de los caracteres invisibles, así como los caracteres que tienen la misma representación gráfica, pero difieren en el significado.
echo «\u{1F602}»; // outputs 😂‚
Ten en cuenta que esto rompe el código existente con la secuencia `\ u ‘porque cambia el comportamiento.
Los Generadores Se Actualizan
Generadores en PHP obtienen también algunas características adicionales agradables. Ahora, los generadores tienen una instrucción de retorno que puede usarse para permitir que produzca un valor final después de la iteración. Esto se puede utilizar para comprobar que el generador se ha ejecutado sin errores y permite que el código que llamó al generador maneje varios escenarios de manera adecuada.
Además, los generadores pueden devolver y rendir expresiones de otros generadores. Esto les permite dividir las operaciones complejas en unidades más simples y modulares.
function genA() { yield 2; yield 3; yield 4; } function genB() { yield 1; yield from genA(); // ‘genA’ Se llama aquí e itera sobre yield 5; return ‘success’; // Este es un resultado final que podemos comprobar más tarde } foreach (genB() as $val) { echo «\n $val»; // Esto emitirá los valores 1 a 5 para} $genB()->getReturn(); // Esto debería devolver el «éxito» cuando no hay errores.
Expectativas
Las expectativas son una mejora de la función de afirmar () mientras se mantiene la compatibilidad hacia atrás. Permiten aserciones de costo cero en el código de producción y proporcionan la posibilidad de lanzar excepciones personalizadas cuando la afirmación falla, lo cual puede ser útil durante el desarrollo.
Afirmar () se convierte en una construcción de lenguaje en PHP 7. Las aserciones deben usarse para propósitos de depuración sólo en entornos de desarrollo y pruebas. Para configurar su comportamiento, se nos proporcionan dos nuevas directivas.
- afirmación- 1: generar y ejecutar código (modo de desarrollo) (valor por defecto) – 0: genera el código pero salta a su alrededor en tiempo de ejecución – -1: no genera código que lo convierte en coste cero (modo de producción)
- afirmación.excepción- 1: lanzar cuando la aserción falla, lanzando el objeto proporcionado como excepción o lanzando un nuevo objeto * ErrorAfirmación * si no se proporcionó la excepción – 0: usa o genera un * Throwable * como se describió anteriormente, pero solo genera una advertencia basada en ese objeto en lugar de lanzarla (compatible con el comportamiento de PHP 5)
Preparación Para Pasar de PHP 5 a PHP 7
La introducción de un lanzamiento importante brinda la oportunidad de cambiar/actualizar las funcionalidades más antiguas o incluso eliminarlas si se consideran demasiado viejas o han quedado obsoletas durante algún tiempo. Tales cambios pueden introducir interrupciones en compatibilidad en aplicaciones más antiguas.
Otro problema que surge de esta versión, es que las bibliotecas y los marcos importantes de los que dependes pueden no haber sido actualizados para soportar la última versión. El equipo de PHP ha intentado hacer los nuevos cambios lo más atrasados posible y permitir que la migración a la nueva versión sea lo más sencilla posible. Las aplicaciones más nuevas y más actualizadas deberían encontrar más fácil pasar a la nueva versión, mientras que las aplicaciones más antiguas pueden tener que decidir si los beneficios superan el costo, posiblemente eligiendo no actualizar.
La mayoría de los descansos son menores y se pueden mitigar fácilmente, mientras que otros pueden requerir más esfuerzo y tiempo. Básicamente, si tenías advertencias de obsoletos en tu aplicación antes de instalar PHP 7 probablemente obtendrás errores que romperán la aplicación hasta que se resuelva. Fuiste advertido, ¿verdad?
Antiguos SAPIs y extensiones
Lo más importante, las SAPIs viejas y desaprobadas fueron eliminadas como la extensión mysql (pero no deberías estar usando esto en primer lugar, ¿verdad?). Para obtener una lista completa de extensiones y destacados eliminado puedes comprobar este RFCs aquí y aquí.
Además, otros SAPIs están siendo portados a PHP 7.
s de variable uniforme
Esta actualización hizo algunos cambios a favor de la coherencia para las construcciones de variable- variable. Esto permite expresiones más avanzadas con variables, pero introduce cambios en el comportamiento en algunos otros casos, como se muestra a continuación.
// old meaning // new meaning $$foo['bar']['baz'] ${$foo['bar']['baz']} ($$foo)['bar']['baz'] $foo->$bar['baz'] $foo->{$bar['baz']} ($foo->$bar)['baz'] $foo->$bar['baz']() $foo->{$bar['baz']}() ($foo->$bar)['baz']() Foo::$bar['baz']() Foo::{$bar['baz']}() (Foo::$bar)['baz']()
Esto rompería el comportamiento de las aplicaciones que accedían a valores como éste. Por otro lado, puede hacer algunas cosas limpias como esto :.
// Nested () foo()(); // Calls the return of foo() $foo->bar()(); // IIFE syntax like JavaScript (function() { // Function body })(); // Nested :: $foo::$bar::$baz
Etiquetas De Estilo Antiguo Eliminadas
Las etiquetas de apertura / cierre « <% …%> , <% = …%> , … </ script> `se eliminan y ya no son válidas. Sustituirlas por los válidos debería ser fácil, pero ¿qué estás haciendo con ellos de todos modos, raro?
Nombres No Válidos Para Clases, Interfaces Y Rasgos
Como resultado de las adiciones, como las clases de tipo de parámetro y retorno, las interfaces y los rasgos ya no pueden tener los siguientes nombres:
- bool - int - float - string - nulo - verdadero - falso
Estos causan roturas a las aplicaciones existentes y las bibliotecas que las utilizan, pero deben ser fáciles de arreglar. Además, aunque no causan ningún error y son válidos, no deben utilizarse los siguientes, ya que están reservados para uso futuro:
-recurso
objecto – mixto – numérico
Abstenerse de usarlos debería ahorrarte el trabajo de cambiarlos en el futuro. Para una lista completa de cambios que romperían la compatibilidad, comprueba este documento.
También puedes utilizar php7cc, que verifica tu código y puede detectar posibles problemas que puedan surgir si te mudas a PHP 7. Pero, por supuesto, no hay mejor manera que instalar PHP 7 y comprobarlo por ti mismo. ## Potenciales Problemas de Compatibilidad con PHP ### PHP 7 Compatibilidad de Infraestructura
Una gran cantidad de servicios de hosting han comenzado a añadir soporte para PHP 7. Esta es una buena noticia para los proveedores de alojamiento compartido, ya que las ganancias de rendimiento les permitirá aumentar el número de sitios web de los clientes en su hardware, reduciendo sus gastos operativos y aumentando sus márgenes. En cuanto a los propios clientes, no deben esperar demasiado de un impulso en estas condiciones, pero para ser justos, el alojamiento compartido no es una opción orientada al rendimiento de todos modos.
Por otro lado, los servicios que ofrecen los servidores privados virtuales o servidores dedicados obtendrán los beneficios completos de este golpe de rendimiento. Algunos servicios de PaaS como Heroku soportaban PHP 7 desde el principio, pero otros servicios, como AWS Beanstalk y OpenShift de Oracle, están rezagados. Consulta el sitio web de tu proveedor PaaS para ver si PHP 7 ya está soportado, o si el soporte viene en un futuro próximo. Por supuesto, los proveedores IaaS te permiten tomar el control del hardware e instalar PHP 7 (o compilar si es más a tu gusto). Los paquetes de PHP 7 ya están disponibles para los principales entornos IaaS.
PHP 7 Compatibilidad de Software
Además de la compatibilidad de infraestructura, también debes tener en cuenta posibles problemas de compatibilidad de software. Los sistemas de gestión de contenidos populares como WordPress, Joomla y Drupal han añadido soporte para PHP 7 con sus últimas versiones. Los marcos importantes como Symfony y Laravel también disfrutan de un apoyo total. Sin embargo, es hora de una palabra de precaución. Este soporte no se extiende a código de terceros en forma de complementos, plugins, paquetes o lo que sea que ru CMS o framework los llame. Pueden sufrir problemas de compatibilidad y es tu responsabilidad asegurarte de que todo esté listo para PHP 7.
Para los repositorios activos y mantenidos, esto no debería ser un problema. Sin embargo, los repositorios antiguos y sin mantenimiento que carecen de soporte de PHP 7 podrían hacer que tu aplicación entera no fuese utilizable.
El futuro de PHP
La versión de PHP 7 eliminó el código antiguo y obsoleto y allanó el camino para nuevas características y actualizaciones de rendimiento en el futuro. Además, se espera que PHP obtenga optimizaciones de rendimiento adicionales pronto. A pesar de tener algunas pausas de compatibilidad con versiones anteriores, la mayoría de los problemas son fáciles de resolver. Las bibliotecas y los frameworks ahora están migrando su código a PHP 7 haciendo disponible así las últimas versiones. Quiero incentivarte a probar y ver los resultados por ti mismo. Tal vez tu aplicación ya es compatible y espera para usar y beneficiarte de, PHP 7.
Artículo vía Toptal.