Descripción general de mis características favoritas de PHP7


Cuando las personas discuten cambios en PHP7, lo más común que se escucha es un motor significativamente mejorado, que cuenta con una velocidad de ejecución más rápida y significativamente menos memoria al comparar aplicaciones PHP comunes como Drupal, WordPress y MediaWiki.


No me malinterpreten, esto es genial. Logré migrar varias aplicaciones heredadas de CodeIgniter a PHP7 y lograr un rendimiento mucho mejor con unos pocos cambios en la base del código. Sin embargo, PHP7 también agrega varias características nuevas que pueden ayudar a optimizar el código existente o mejorar la calidad de la escritura de código nuevo. Aquí he esbozado varias de mis características seleccionadas.


Parámetro escalar y retorno del tipo declarado


PHP tenía declaraciones de tipo hasta la versión 7, pero estaba limitado solo a objetos y matrices. PHP7 ahora proporciona soporte para todos los tipos escalares y ofrece dos declaraciones de tipos diferentes.


Forzado:


es el tipo de declaración predeterminado y simplemente significa que el tiempo de ejecución de PHP intentará emitir valores cuando sea necesario. Tomemos, por ejemplo, el siguiente código.


<?php function reverseString(String $str) : String { return strrev($str); } print(reverseString(1234)); 

Indicamos que el parámetro $str debe ser de tipo String y que el valor de retorno también debe ser de tipo String . Por lo tanto, cuando pasamos el número 1234, se traduce a la fuerza a la cadena "1234" y se traduce sin errores.


Estricto:


El segundo tipo, estricto, se habilita utilizando el indicador agregado al comienzo de cada archivo. Cuando está activado, el intérprete no emite el tipo, como en el ejemplo anterior, responde con un error y detiene el script.


 <?PHP declare(strict_types = 1); function reverseString(String $str): String { return strrev($str); } print (reverseString(1234)); 

Al agregar una sola declare declaración al comienzo del archivo, en el mismo código que antes, ahora recibimos el siguiente mensaje de error:


Error fatal: Tipo de error no capturado: el argumento 1 pasado a reverseString () debe ser del tipo cadena, entero dado

Una pequeña adición: cuando habilita el modo estricto, esto también se aplica a las funciones integradas y funciones PHP cargadas desde extensiones.


Operador nulo ??


A diferencia de algunos lenguajes, donde puede usar el nombre de la variable como una expresión en la expresión if y asumir con seguridad que si el valor no está definido o vacío, entonces el valor será false , PHP arrojará un error sobre una variable indefinida, índice, etc. Esto lo convierte en un código regular muy detallado que usa if que otros idiomas, como en el siguiente ejemplo.


  <?php if(!isset($_GET['key'])) { $key = 'default-value'; } else { $key = $_GET['key']; } 

Incluso cuando se utiliza el operador ternario, se requiere la función isset . ¿Con el nuevo operador nulo ?? puedes facilitar mucho el código:


  <?PHP $key = $_GET['key'] ?? 'default_value'; 

Este uso es aún más eficiente en el encadenamiento de casos que requieren una o más if .


  <?php if (isset($_GET['key']) { $key = $_GET['key']; } else if(isset($_POST['key'])) { $key = $_POST['key']; } else { $key = 'default value'; } // Versus $key = $_GET['key'] ?? $_POST['key'] ?? 'default value'; 

Pequeña adición: si trabaja con JavaScript, puede hacer cosas como esta:


 const value = 0 || false || 'hello'; console.log(value); // hello 

Esto no funcionará en PHP, y el código PHP equivalente establecerá el valor en 0, ya que el nuevo operador solo funciona con valores null .


Declaraciones de uso grupal


En versiones anteriores de PHP, solo podía importar un elemento (clase, función, constante) desde un espacio de nombres específico en una sola expresión usando la declaración de uso. Esto a menudo condujo a un código muy repetitivo, como en el siguiente ejemplo.


 <?php use VendorName/LibraryName/ClasName1; use VendorName/LibraryName/ClasName2; use VendorName/LibraryName/ClasName3; 

Al agrupar, lo anterior se puede abreviar, como se muestra en el ejemplo a continuación, lo que le permite obtener un código más limpio e intuitivo de lo que se importa y de dónde.


 <?php use VendorName/LibraryName/{ClasName1, ClassName2. ClassName3}; 

Matrices constantes


Las constantes con nombre son una herramienta muy valiosa en PHP. Un caso de uso común es mejorar la legibilidad del código al proporcionar nombres semánticos para datos arbitrarios, como colores, valores RGB o números mágicos en el código que son ambiguos y pueden ser confusos en otros casos.
Cualquiera que haya estado trabajando con PHP durante mucho tiempo probablemente verá una aplicación con un archivo constante (o incluso varios archivos) que contiene docenas, si no cientos de constantes con nombre, que requieren nombres largos y descriptivos para evitar conflictos de nombres.


 <?php define('COLOR_RED', '#f44141'); define('COLOR_BLUE', '#4286f4'); define('COLOR_GREEN', '#1ae01e'); define('COLOR_PURPLE', '#f309f7'); define('COLOR_ORANGE', '#ef7700'); 

Las constantes con nombre, además de los tipos de datos admitidos anteriormente, pueden ser matrices indexadas o asociativas. Esto ayudará a agrupar con mayor precisión muchas constantes con nombre que pueda tener en su aplicación.


 <?php //     define('COLORS', [ 'red' => '#f44141', 'blue' => '#4286f4', 'green' => '#1ae01e', 'purple' => '#f309f7', 'orange' => '#ef7700', ]); echo(COLORS['red']); // #f44141 //    define('COLORS', [ 'red', 'blue', 'green', 'purple', 'orange', ]); echo(COLORS[0]); // 'red' 

Conclusión


Hay algunas características nuevas más geniales que no he mencionado, como las clases anónimas y el operador de la nave espacial. Así que definitivamente revise la documentación de PHP.net para más información. Gracias por tomarse el tiempo de leer todo esto y dejar cualquier pregunta o comentario a continuación.


Gracias Berez por los comentarios.

Source: https://habr.com/ru/post/es419625/


All Articles