Introducción a PHP 7: Qué hay de nuevo y qué se ha ido
Publicado: 2022-03-11Uno de los eventos más emocionantes de 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 presenta muchas funciones nuevas y mejoras de rendimiento. .
Sin embargo, también elimina la funcionalidad antigua y obsoleta, lo que introduce algunas interrupciones de compatibilidad, lo que dificulta que las aplicaciones antiguas migren a la nueva versión. Esta guía debería servir como un recorrido rápido sobre qué esperar si planea mover sus aplicaciones existentes o crear otras nuevas sobre PHP 7.
Pero espera, ¿adónde fue PHP 6?
Si no ha estado trabajando con PHP últimamente, es posible que se pregunte qué pasó con PHP 6, ¿por qué pasó de PHP 5 a PHP 7? Bueno, para resumir, PHP 6 fue un fracaso. La característica principal de la versión 6 fue la compatibilidad nativa con los caracteres Unicode, ya que PHP se usa principalmente en el desarrollo web y la web necesita Unicode, por lo que la decisión de llevar Unicode a PHP tenía sentido.
La idea era brindar soporte completo para Unicode al propio núcleo. Habría aportado capacidades ampliadas al lenguaje, desde la capacidad de usar emojis tontos como nombres de variables y funciones, hasta una potente funcionalidad de cadena internacional. Por ejemplo, cuando otro idioma usa letras mayúsculas y minúsculas de manera diferente al inglés, o cuando un nombre en caracteres chinos debe convertirse al inglés.
Desafortunadamente, este ambicioso plan resultó ser un problema mayor de lo previsto. Gran parte del código base tuvo que ser portado para admitir Unicode tanto para el núcleo como para las extensiones importantes, lo que resultó tedioso y complicado. Esto ralentizó el desarrollo de otras funciones en el lenguaje, lo que frustró a muchos desarrolladores de PHP en el proceso. Aparecieron obstáculos adicionales, lo que resultó en un menor interés en desarrollar un soporte Unicode nativo, lo que finalmente llevó al abandono del proyecto.
Dado que los recursos, como libros y artículos, se escribieron para PHP 6 y su compatibilidad con Unicode, la nueva versión se llamaría PHP 7 para evitar confusiones.
De todos modos, basta de vivir en el triste pasado, veamos qué trae PHP 7 a la fiesta.
Batalla de rendimiento, PHP 7 frente a PHP 5
Con prácticamente todas las actualizaciones, se esperan mejoras menores de rendimiento. Sin embargo, esta vez PHP trae una mejora significativa con respecto a las versiones anteriores, lo que hace que el rendimiento sea una de las características más atractivas de PHP 7. Esto viene como parte del proyecto "PHPNG", que aborda las partes internas del propio Zend Engine.
Al refactorizar estructuras de datos internas y agregar un paso intermedio a la compilación de código en forma de árbol de sintaxis abstracta (AST), el resultado es un rendimiento superior y una asignación de memoria más eficiente. Los números en sí mismos parecen muy prometedores; Los puntos de referencia realizados en aplicaciones del mundo real muestran que PHP 7 es dos veces más rápido que PHP 5.6 en promedio y da como resultado un 50 por ciento menos de consumo de memoria durante las solicitudes, lo que convierte a PHP 7 en un fuerte rival para el compilador HHVM JIT de Facebook. Eche un vistazo a esta infografía de Zend que muestra el rendimiento de algunos CMS y Frameworks comunes.
La disminución en el consumo de memoria también permite que las máquinas más pequeñas manejen mejor las solicitudes junto con la oportunidad de crear microservicios alrededor de PHP. Los cambios internos, en particular la implementación de AST, también abren posibilidades para futuras optimizaciones que podrían impulsar aún más el rendimiento. Se está considerando una nueva implementación interna de un compilador JIT para futuras versiones.
Azúcar sintáctico de PHP 7
PHP 7 viene con nuevas funciones de sintaxis. Si bien no amplían las capacidades del lenguaje en sí, proporcionan una forma mejor, o más sencilla, de hacer que su código sea más agradable de escribir y agradable a la vista.
Declaraciones de importación de grupo
Ahora, podemos agrupar declaraciones de importación para clases que se originan en el mismo espacio de nombres en una sola línea de use
. Esto debería ayudar a alinear las declaraciones de manera significativa o simplemente guardar algunos bytes en sus 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 prefiere un estilo de varias líneas:
use Framework\Module{ Foo, Bar, Baz };
Operador coalescente nulo
Esto resuelve un problema común en la programación de PHP, donde queremos asignar un valor a una variable de otra variable, si esta última está realmente configurada, o proporcionarle un valor diferente. Se usa comúnmente cuando trabajamos con entradas proporcionadas 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 se puede encadenar con una serie de variables:
$bar = $foo ?? $baz ?? 'default';
Operador de nave espacial
El operador de 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, en desigualdad al devolver 1, 0 o -1.
Aquí podemos tomar diferentes acciones dependiendo de cómo difieran los valores:
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. Consulte la documentación para tener una idea de cómo se comparan los diferentes valores entre sí. [https://wiki.php.net/rfc/combined-comparison-operator]
Nuevas características en PHP 7
Pero, por supuesto, PHP 7 también trae consigo una funcionalidad nueva y emocionante.
Tipos de parámetros escalares y sugerencias de tipos de retorno
PHP 7 amplía las declaraciones de tipos anteriores de parámetros en métodos (clases, interfaces y matrices) al agregar los cuatro tipos escalares; Enteros ( int
), flotantes ( float
), booleanos ( bool
) y cadenas ( string
) como posibles tipos de parámetros.
Además, opcionalmente podemos especificar qué tipo de métodos y funciones devuelven. Los tipos admitidos son bool , int , float , string , array , callable , name of Class o Interface , self y parent (para métodos de clase)
class Calculator { // We declare that the parameters provided are of type integer public function addTwoInts(int $x, int $y): int { return $x + $y; // We also explicitly say that this method will return an integer } }
Las declaraciones de tipo permiten la creació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 IDE, que brindan una mejor perspectiva de la base de código si faltan DocBlocks.
Dado que PHP es un lenguaje débilmente tipificado, ciertos valores para parámetros y tipos de devolución se emitirán según el 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 número entero y no arrojará ningún error. Si no desea esto, puede habilitar el strict mode
agregando una directiva de declare
.
declare(strict_types=1);
Esto se establece por archivo, ya que una opción global dividiría los repositorios de código en aquellos que están construidos con un rigor global y aquellos que no lo están, lo que resulta en un comportamiento inesperado cuando combinamos el código de ambos.
Excepciones del motor
Con la adición de excepciones de motor, los errores fatales que habrían resultado en la finalización del script pueden detectarse y manejarse fácilmente.
Los errores, como llamar a un método inexistente, no terminarán el script, sino que generarán una excepción que puede ser manejada por un bloque try catch, lo que mejora el manejo de errores para sus aplicaciones. Esto es importante para ciertos tipos de aplicaciones, servidores y demonios porque, de lo contrario, los errores fatales requerirían que se reiniciaran. Las pruebas en PHPUnit también deberían volverse más utilizables ya que los errores fatales descartan todo el conjunto de pruebas. Las excepciones, en lugar de los errores, se manejarían caso por caso.
PHP 7 agrega una serie de nuevas clases de excepción basadas en el tipo de errores que se pueden encontrar. Para mantener la compatibilidad entre versiones, se ha agregado una nueva interfaz Throwable
que se puede implementar tanto desde las excepciones del motor como desde las excepciones del usuario. Esto fue necesario para evitar excepciones del motor para extender la clase de excepción base, lo que resultó en excepciones de captura de código más antiguas 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 primas de las funciones anónimas que podría usar en una instancia simple a corto plazo. Las clases anónimas se crean y utilizan fácilmente como un objeto normal. Aquí hay un ejemplo de los documentos.
Pre-PHP 7
class MyLogger { public function log($msg) { print_r($msg . "\n"); } } $pusher->setLogger( new MyLogger() );
Con clase anónima:
$pusher->setLogger(new class { public function log($msg) { print_r($msg . "\n"); } });
Las clases anónimas son útiles en las pruebas unitarias, particularmente en la simulación de objetos y servicios de prueba. Esto nos ayuda a evitar bibliotecas y marcos de trabajo que se burlan mucho al crear un objeto simple que proporciona la interfaz que queremos simular.

Funciones CSPRNG
Se agregaron dos nuevas funciones para generar cadenas y enteros criptográficamente seguros.
random_bytes(int $len);
Devuelve una cadena aleatoria con longitud $len
.
random_int(int $min, int $max);
Devuelve un número entre $min
y $max
.
Sintaxis de escape de punto de código Unicode
A diferencia de muchos otros lenguajes, antes de PHP 7, PHP no tenía forma de escapar de un punto de código Unicode en cadenas literales, . Esta funcionalidad agrega la secuencia de escape \u
para producir tales caracteres usando su punto de código UTF-8. Esto es mejor que insertar los caracteres directamente, lo que permite un mejor manejo de los caracteres invisibles, así como de los caracteres que tienen la misma representación gráfica pero difieren en significado.
echo "\u{1F602}"; // outputs ‚
Tenga en cuenta que esto rompe el código existente con la secuencia \u
porque cambia el comportamiento.
Los generadores se actualizan
Los generadores en PHP también obtienen algunas características adicionales interesantes. Ahora, los generadores tienen una declaración de retorno que se puede usar para permitirle generar un valor final después de la iteración. Esto se puede usar para verificar que el generador se haya 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 generar expresiones de otros generadores. Esto les permite dividir 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' gets called here and iterated over yield 5; return 'success'; // This is a final result we can check later } foreach (genB() as $val) { echo "\n $val"; // This will output values 1 to 5 in order } $genB()->getReturn(); // This should return 'success' when there are no errors.
Expectativas
Las expectativas son una mejora de la función assert()
mientras se mantiene la compatibilidad con versiones anteriores. Permiten aserciones de costo cero en el código de producción y brindan la capacidad de lanzar excepciones personalizadas cuando falla la aserción, lo que puede ser útil durante el desarrollo.
assert()
se convierte en una construcción de lenguaje en PHP 7. Las afirmaciones deben usarse con fines de depuración solo en entornos de desarrollo y prueba. Para configurar su comportamiento contamos con dos nuevas directivas.
-
zend.assertions
-
1
: generar y ejecutar código (modo de desarrollo) (valor predeterminado) -
0
: genera el código pero lo salta en tiempo de ejecución -
-1
: no genera código por lo que es de costo cero (modo de producción)
-
-
assert.exception
-
1
: lanzar cuando falla la aserción, ya sea lanzando el objeto proporcionado como excepción o lanzando un nuevo objeto AssertionError si no se proporcionó la excepción -
0
: use o genere un Throwable como se describe arriba, pero solo genere una advertencia basada en ese objeto en lugar de lanzarlo (compatible con el comportamiento de PHP 5)
-
Preparándose para pasar de PHP 5 a PHP 7
La introducción de una versión principal brinda la oportunidad de cambiar/actualizar funcionalidades anteriores o incluso eliminarlas si se consideran demasiado antiguas o han quedado obsoletas durante algún tiempo. Dichos cambios pueden introducir interrupciones en la compatibilidad en aplicaciones más antiguas.
Otro problema que surge de tales saltos de versión es que es posible que las bibliotecas y los marcos importantes de los que depende aún no se hayan actualizado para admitir la última versión. El equipo de PHP ha tratado de hacer que los nuevos cambios sean lo más compatibles posible con versiones anteriores y permitir que la migración a la nueva versión sea lo menos dolorosa posible. A las aplicaciones más nuevas y actualizadas les resultará 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 decidiendo 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ía advertencias de desaprobación en su aplicación antes de instalar PHP 7, probablemente obtendrá errores que romperán la aplicación hasta que se solucionen. Estabas advertido, ¿verdad?
Antiguos SAPI y Extensiones
Lo que es más importante, los SAPI antiguos y obsoletos se eliminaron como la extensión mysql
(pero no debería usar esto en primer lugar, ¿verdad?). Para obtener una lista completa de las extensiones y funciones eliminadas, puede consultar este RFC aquí y aquí.
Además, otros SAPI se están migrando a PHP 7.
Sintaxis de variable uniforme
Esta actualización hizo algunos cambios a favor de la consistencia 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 acceden a valores como este. Por otro lado, puedes hacer algunas cosas geniales como esta:
// 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 language="php"> ... </script>
se eliminan y ya no son válidas. Reemplazarlos con los válidos debería ser fácil, pero ¿qué haces usándolos de todos modos, Bicho raro?
Nombres no válidos para clases, interfaces y rasgos
Como resultado de adiciones como parámetros y clases de tipos de devolución, las interfaces y las características ya no pueden tener los siguientes nombres:
- bool
- En t
- flotador
- cuerda
- nulo
- cierto
- falso
Estos causan interrupciones en las aplicaciones y bibliotecas existentes que los usan, pero deberían ser fáciles de solucionar. Además, aunque no provocan ningún error y son válidos, no se deben utilizar los siguientes ya que están reservados para uso futuro:
- recurso
- objeto
- mezclado
- numérico
Abstenerse de usarlos debería ahorrarle el trabajo de cambiarlos en el futuro.
Para obtener una lista completa de los cambios que romperían la compatibilidad, consulte este documento.
También puede usar php7cc, que verifica su código y puede detectar cualquier problema potencial que pueda surgir si cambia a PHP 7. Pero, por supuesto, no hay mejor manera que instalar PHP 7 y ver por sí mismo.
Problemas potenciales de compatibilidad con PHP 7
Compatibilidad con la infraestructura de PHP 7
Muchos servicios de alojamiento han comenzado a agregar soporte para PHP 7. Esta es una buena noticia para los proveedores de alojamiento compartido, ya que las mejoras en el rendimiento les permitirán aumentar la cantidad de sitios web de clientes en su hardware, reducir sus gastos operativos y aumentar sus márgenes. En cuanto a los propios clientes, no deberían esperar un gran 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 servidores privados virtuales o servidores dedicados obtendrán todos los beneficios de este aumento de rendimiento. Algunos servicios PaaS como Heroku admitieron PHP 7 desde el principio, pero otros servicios, como AWS Beanstalk y OpenShift de Oracle, se están quedando atrás. Consulte el sitio web de su proveedor de PaaS para ver si PHP 7 ya es compatible o si la compatibilidad llegará en un futuro próximo.
Por supuesto, los proveedores de IaaS le permiten tomar el control del hardware e instalar PHP 7 (o compilar si eso es más de su agrado). Los paquetes de PHP 7 ya están disponibles para los principales entornos de IaaS.
Compatibilidad del software PHP 7
Además de la compatibilidad de la infraestructura, también debe tener en cuenta los posibles problemas de compatibilidad del software. Los sistemas de administración de contenido populares como WordPress, Joomla y Drupal han agregado soporte para PHP 7 con sus últimas versiones. Los principales marcos como Symfony y Laravel también disfrutan de soporte completo.
Sin embargo, es hora de una palabra de precaución. Este soporte no se extiende al código de terceros en forma de complementos, complementos, paquetes o como los llame su CMS o marco. Pueden sufrir problemas de compatibilidad y es su responsabilidad asegurarse de que todo esté listo para PHP 7.
Para repositorios activos y mantenidos, esto no debería ser un problema. Sin embargo, los repositorios más antiguos y sin mantenimiento que carecen de compatibilidad con PHP 7 podrían inutilizar toda su aplicación.
El futuro de PHP
El lanzamiento de PHP 7 eliminó el código antiguo y obsoleto y allanó el camino para nuevas funciones y mejoras de rendimiento en el futuro. Además, se espera que PHP obtenga optimizaciones de rendimiento adicionales pronto. A pesar de tener algunas interrupciones de compatibilidad con versiones anteriores, la mayoría de los problemas son fáciles de resolver.
Las bibliotecas y los marcos ahora están migrando su código a PHP 7, lo que hace que estén disponibles las últimas versiones. Te animo a que lo pruebes y veas los resultados por ti mismo. Tal vez su aplicación ya sea compatible y esté esperando para usar y beneficiarse de PHP 7.