PHP 7 - Guía rápida

¿Qué es PHP 7?

PHP 7 es una versión importante del lenguaje de programación PHP y se promociona como una revolución en la forma en que las aplicaciones web se pueden desarrollar y entregar para dispositivos móviles a empresas y la nube. Esta versión se considera el cambio más importante para PHP después del lanzamiento de PHP 5 en 2004.

Nuevas características

Hay docenas de características agregadas a PHP 7, las más importantes se mencionan a continuación:

  • Improved performance - Habiendo combinado el código PHPNG en PHP7, es dos veces más rápido que PHP 5.

  • Lower Memory Consumption - PHP 7 optimizado utiliza menos recursos.

  • Scalar type declarations - Ahora se pueden aplicar los tipos de parámetros y devoluciones.

  • Consistent 64-bit support - Soporte consistente para máquinas con arquitectura de 64 bits.

  • Improved Exception hierarchy - Se mejora la jerarquía de excepciones.

  • Many fatal errors converted to Exceptions - El rango de excepciones se incrementa cubriendo muchos errores fatales convertidos como excepciones.

  • Secure random number generator - Adición de una nueva API segura generadora de números aleatorios.

  • Deprecated SAPIs and extensions removed - Se eliminan varias extensiones y SAPI antiguas y no compatibles de la última versión.

  • The null coalescing operator (??) - Se agregó un nuevo operador de fusión nula.

  • Return and Scalar Type Declarations - Se agregó soporte para el tipo de retorno y el tipo de parámetro.

  • Anonymous Classes - Soporte para anónimos agregado.

  • Zero cost asserts - Se agregó soporte para aseveración de costo cero.

PHP 7 utiliza el nuevo Zend Engine 3.0 para mejorar el rendimiento de la aplicación casi dos veces y un 50% más de consumo de memoria que PHP 5.6. Permite atender a más usuarios simultáneos sin necesidad de hardware adicional. PHP 7 está diseñado y refactorizado considerando las cargas de trabajo actuales.

Según el equipo de Zend , las siguientes ilustraciones muestran la comparación de rendimiento de PHP 7 frente a PHP 5.6 y HHVM 3.7 en aplicaciones populares basadas en PHP.

Magento 1.9

PHP 7 demuestra ser más del doble de rápido, en comparación con PHP 5.6 al ejecutar transacciones de Magento.

Drupal 7

PHP 7 demuestra ser más del doble de rápido, en comparación con PHP 5.6 al ejecutar transacciones Drupal.

Wordpress 3.6

PHP 7 demuestra ser más del doble de rápido en comparación con PHP 5.6 al ejecutar transacciones de Wordpress.

Comparación de lenguajes dinámicos

Pruébelo Opción en línea

Hemos configurado el entorno de programación PHP en línea, para que pueda compilar y ejecutar todos los ejemplos disponibles en línea. Le da confianza en lo que está leyendo y le permite verificar los programas con diferentes opciones. Siéntase libre de modificar cualquier ejemplo y ejecutarlo en línea.

Pruebe el siguiente ejemplo utilizando nuestro compilador en línea disponible en

<html>
   <head>
      <title>Online PHP Script Execution</title>
   </head>
   <body>
      <?php
         echo "<h1>Hello, PHP!</h1>";
      ?>   
   </body>
</html>

Para la mayoría de los ejemplos dados en este tutorial, encontrará un Try iten las secciones de código de nuestro sitio web en la esquina superior derecha que lo llevará al compilador en línea. Así que usa y disfruta tu aprendizaje.

Para desarrollar y ejecutar páginas web PHP, es necesario instalar tres componentes vitales en su sistema informático.

  • Web Server- PHP funciona con prácticamente todo el software de servidor web, incluido el servidor de información de Internet (IIS) de Microsoft, pero el más utilizado es el servidor Apache. Descarga Apache gratis aquí -http://httpd.apache.org/download.cgi

  • Database- PHP PHP funciona con prácticamente todo el software de base de datos, incluidos Oracle y Sybase, pero el más utilizado es la base de datos MySQL. Descarga MySQL gratis aquí -http://www.mysql.com/downloads/

  • PHP Parser- Para procesar las instrucciones de la secuencia de comandos PHP, se debe instalar un analizador para generar una salida HTML que se pueda enviar al navegador web. Este tutorial le guiará sobre cómo instalar el analizador PHP en su computadora.

Instalación del analizador PHP

Antes de continuar, es importante asegurarse de tener la configuración adecuada del entorno en su máquina para desarrollar sus programas web usando PHP. Almacene el siguiente archivo php en la carpeta htdocs de Apache.

phpinfo.php

<?php
   phpinfo();
?>

Escriba la siguiente dirección en el cuadro de dirección de su navegador.

http://127.0.0.1/phpinfo.php

Si muestra una página que muestra la información relacionada con la instalación de PHP, significa que tiene PHP y el servidor web instalados correctamente. De lo contrario, debe seguir el procedimiento dado para instalar PHP en su computadora.

Esta sección lo guiará para instalar y configurar PHP en las siguientes cuatro plataformas:

Configuración de Apache

Si está utilizando Apache como servidor web, esta sección lo guiará para editar los archivos de configuración de Apache.

Compruebe aquí - Configuración de PHP en el servidor Apache

Configuración del archivo PHP.INI

El archivo de configuración de PHP, php.ini, es la forma final e inmediata de afectar la funcionalidad de PHP.

Marque aquí - Configuración del archivo PHP.INI

Configuración de Windows IIS

Para configurar IIS en su máquina Windows, puede consultar el Manual de referencia de IIS que se envía junto con IIS.

En PHP 7, se ha introducido una nueva característica, declaraciones de tipo escalar. La declaración de tipo escalar tiene dos opciones:

  • coercive - coercitivo es el modo predeterminado y no es necesario especificarlo.

  • strict - El modo estricto tiene que insinuarse explícitamente.

Los siguientes tipos de parámetros de función se pueden aplicar utilizando los modos anteriores:

  • int
  • float
  • bool
  • string
  • interfaces
  • array
  • callable

Ejemplo: modo coercitivo

<?php
   // Coercive mode
   function sum(int ...$ints) {
      return array_sum($ints);
   }
   print(sum(2, '3', 4.1));
?>

Produce la siguiente salida del navegador:

9

Ejemplo: modo estricto

<?php
   // Strict mode
   declare(strict_types=1);
   function sum(int ...$ints) {
      return array_sum($ints);
   }
   print(sum(2, '3', 4.1));
?>

Produce la siguiente salida del navegador:

Fatal error: Uncaught TypeError: Argument 2 passed to sum() must be of the type integer, string given, ...

En PHP 7, una nueva característica, Return type declarationsha sido introducido. La declaración de tipo de retorno especifica el tipo de valor que debe devolver una función. Se pueden declarar los siguientes tipos para los tipos de devolución.

  • int
  • float
  • bool
  • string
  • interfaces
  • array
  • callable

Ejemplo: tipo de devolución válido

<?php
   declare(strict_types = 1);
   function returnIntValue(int $value): int {
      return $value;
   }
   print(returnIntValue(5));
?>

Produce la siguiente salida del navegador:

5

Ejemplo: tipo de devolución no válido

<?php
   declare(strict_types = 1);
   function returnIntValue(int $value): int {
      return $value + 1.0;
   }
   print(returnIntValue(5));
?>

Produce la siguiente salida del navegador:

Fatal error: Uncaught TypeError: Return value of returnIntValue() must be of the type integer, float returned...

En PHP 7, una nueva característica, null coalescing operator (??)ha sido introducido. Se utiliza para reemplazar elternaryoperación junto con la función isset (). losNullEl operador coalescente devuelve su primer operando si existe y no es NULL; de lo contrario, devuelve su segundo operando.

Ejemplo

<?php
   // fetch the value of $_GET['user'] and returns 'not passed'
   // if username is not passed
   $username = $_GET['username'] ?? 'not passed';
   print($username);
   print("<br/>");

   // Equivalent code using ternary operator
   $username = isset($_GET['username']) ? $_GET['username'] : 'not passed';
   print($username);
   print("<br/>");
   // Chaining ?? operation
   $username = $_GET['username'] ?? $_POST['username'] ?? 'not passed';
   print($username);
?>

Produce la siguiente salida del navegador:

not passed
not passed
not passed

En PHP 7, se introdujo una nueva característica, operador de nave espacial. Se usa para comparar dos expresiones. Devuelve -1, 0 o 1 cuando la primera expresión es, respectivamente, menor, igual o mayor que la segunda expresión.

Ejemplo

<?php
   //integer comparison
   print( 1 <=> 1);print("<br/>");
   print( 1 <=> 2);print("<br/>");
   print( 2 <=> 1);print("<br/>");
   print("<br/>");
   
   //float comparison
   print( 1.5 <=> 1.5);print("<br/>");
   print( 1.5 <=> 2.5);print("<br/>");
   print( 2.5 <=> 1.5);print("<br/>");
   print("<br/>");
   
   //string comparison
   print( "a" <=> "a");print("<br/>");
   print( "a" <=> "b");print("<br/>");
   print( "b" <=> "a");print("<br/>");
?>

Produce la siguiente salida del navegador:

0
-1
1

0
-1
1

0
-1
1

Las constantes de matriz ahora se pueden definir usando el define()función. En PHP 5.6, solo se podían definir usandoconst palabra clave.

Ejemplo

<?php
   //define a array using define function
   define('animals', [
      'dog',
      'cat',
      'bird'
   ]);
   print(animals[1]);
?>

Produce la siguiente salida del navegador:

cat

Las clases anónimas ahora se pueden definir usando una nueva clase. La clase anónima se puede utilizar en lugar de una definición de clase completa.

Ejemplo

<?php
   interface Logger {
      public function log(string $msg);
   }

   class Application {
      private $logger;

      public function getLogger(): Logger {
         return $this->logger;
      }

      public function setLogger(Logger $logger) {
         $this->logger = $logger;
      }  
   }

   $app = new Application;
   $app->setLogger(new class implements Logger {
      public function log(string $msg) {
         print($msg);
      }
   });

   $app->getLogger()->log("My first Log Message");
?>

Produce la siguiente salida del navegador:

My first Log Message

Closure::call()El método se agrega como una forma abreviada de vincular temporalmente un alcance de objeto a un cierre e invocarlo. Es mucho más rápido en rendimiento en comparación conbindTo de PHP 5.6.

Ejemplo: Pre PHP 7

<?php
   class A {
      private $x = 1;
   }

   // Define a closure Pre PHP 7 code
   $getValue = function() {
      return $this->x;
   };

   // Bind a clousure
   $value = $getValue->bindTo(new A, 'A'); 

   print($value());
?>

Produce la siguiente salida del navegador:

1

Ejemplo: PHP 7+

<?php
   class A {
      private $x = 1;
   }

   // PHP 7+ code, Define
   $value = function() {
      return $this->x;
   };

   print($value->call(new A));
?>

Produce la siguiente salida del navegador:

1

PHP 7 presenta Filtered unserialize()función para proporcionar una mayor seguridad al anular la serialización de objetos en datos que no son de confianza. Previene posibles inyecciones de código y permite al desarrollador incluir en la lista blanca las clases que pueden no serializarse.

Ejemplo

<?php
   class MyClass1 { 
      public $obj1prop;   
   }
   class MyClass2 {
      public $obj2prop;
   }

   $obj1 = new MyClass1();
   $obj1->obj1prop = 1;
   $obj2 = new MyClass2();
   $obj2->obj2prop = 2;

   $serializedObj1 = serialize($obj1);
   $serializedObj2 = serialize($obj2);

   // default behaviour that accepts all classes
   // second argument can be ommited.
   // if allowed_classes is passed as false, unserialize converts all objects into __PHP_Incomplete_Class object
   $data = unserialize($serializedObj1 , ["allowed_classes" => true]);

   // converts all objects into __PHP_Incomplete_Class object except those of MyClass1 and MyClass2
   $data2 = unserialize($serializedObj2 , ["allowed_classes" => ["MyClass1", "MyClass2"]]);

   print($data->obj1prop);
   print("<br/>");
   print($data2->obj2prop);
?>

Produce la siguiente salida del navegador:

1
2

En PHP7, un nuevo IntlCharse agrega la clase, que busca exponer la funcionalidad adicional de la UCI. Esta clase define una serie de métodos y constantes estáticos, que se pueden utilizar para manipular caracteres Unicode. Necesitas tenerIntl extensión instalada antes de usar esta clase.

Ejemplo

<?php
   printf('%x', IntlChar::CODEPOINT_MAX);
   print (IntlChar::charName('@'));
   print(IntlChar::ispunct('!'));
?>

Produce la siguiente salida del navegador:

10ffff
COMMERCIAL AT
true

En PHP 7, se introducen las siguientes dos funciones nuevas para generar enteros y cadenas criptográficamente seguros de forma multiplataforma.

  • random_bytes() - Genera bytes pseudoaleatorios criptográficamente seguros.

  • random_int() - Genera enteros pseudoaleatorios criptográficamente seguros.

bytes_aleatorios ()

random_bytes () genera una cadena de longitud arbitraria de bytes aleatorios criptográficos que son adecuados para uso criptográfico, como cuando se generan sales, claves o vectores de inicialización.

Sintaxis

string random_bytes ( int $length )

Parámetros

  • length - La longitud de la cadena aleatoria que debe devolverse en bytes.

Valores devueltos

  • Devuelve una cadena que contiene el número solicitado de bytes aleatorios criptográficamente seguros.

Errores / Excepciones

  • Si no se puede encontrar una fuente apropiada de aleatoriedad, se lanzará una excepción.

  • Si se dan parámetros no válidos, TypeError será arrojado.

  • Si se proporciona una longitud de bytes no válida, se lanzará un error.

Ejemplo

<?php
   $bytes = random_bytes(5);
   print(bin2hex($bytes));
?>

Produce la siguiente salida del navegador:

54cc305593

random_int ()

random_int() genera números enteros aleatorios criptográficos que son adecuados para su uso donde los resultados no sesgados son críticos.

Sintaxis

int random_int ( int $min , int $max )

Parámetros

  • min - El valor más bajo a devolver, que debe ser PHP_INT_MIN o mas alto.

  • max - El valor más alto que se devolverá, que debe ser menor o igual que PHP_INT_MAX.

Valores devueltos

  • Devuelve un entero aleatorio criptográficamente seguro en el rango de mínimo a máximo, inclusive.

Errores / Excepciones

  • Si no se puede encontrar una fuente apropiada de aleatoriedad, Exception será arrojado.

  • Si se dan parámetros no válidos, TypeError será arrojado.

  • Si max es menor que min, un Error será arrojado.

Ejemplo

<?php
   print(random_int(100, 999));
   print(" ");
   print(random_int(-1000, 0));
?>

Produce la siguiente salida del navegador:

614
-882

Expectationsson una mejora compatible con versiones anteriores de la función vieja assert (). Expectation permite afirmaciones de costo cero en el código de producción y proporciona la capacidad de lanzar excepciones personalizadas cuando falla la afirmación. assert () es ahora una construcción de lenguaje, donde el primer parámetro es una expresión en comparación con ser una cadena o booleano para ser probado.

Directivas de configuración para assert ()

Directiva Valor por defecto Valores posibles
zend.assertions 1

1 - generar y ejecutar código (modo de desarrollo)

0 - generar código pero saltarlo en tiempo de ejecución

-1 - no generar código (modo de producción)

assert.exception 0

1 - lanzar, cuando la aserción falla, ya sea lanzando el objeto provisto como excepción o lanzando un nuevo AssertionError objeto si no se proporcionó una excepción.

0 - use o genere un Throwable como se describe anteriormente, pero solo genera una advertencia basada en ese objeto en lugar de lanzarlo (compatible con el comportamiento de PHP 5)

Parámetros

  • assertion- La afirmación. En PHP 5, esto debe ser una cadena para ser evaluada o un booleano para ser probado. En PHP 7, también puede ser cualquier expresión que devuelva un valor, que se ejecutará y el resultado se utilizará para indicar si la aserción tuvo éxito o no.

  • description - Una descripción opcional que se incluirá en el mensaje de falla, si falla la aserción.

  • exception - En PHP 7, el segundo parámetro puede ser un Throwable objeto en lugar de una cadena descriptiva, en cuyo caso este es el objeto que se lanzará, si la aserción falla y la assert.exception la directiva de configuración está habilitada.

Valores devueltos

FALSE si la afirmación es falsa, TRUE de otra manera.

Ejemplo

<?php
   ini_set('assert.exception', 1);

   class CustomError extends AssertionError {}

   assert(false, new CustomError('Custom Error Message!'));
?>

Produce la siguiente salida del navegador:

Fatal error: Uncaught CustomError: Custom Error Message! in...

Desde PHP7 en adelante, se puede usar una declaración de uso único para importar clases, funciones y constantes desde el mismo espacio de nombres en lugar de declaraciones de uso múltiple.

Ejemplo

<?php
   // Before PHP 7
   use com\tutorialspoint\ClassA;
   use com\tutorialspoint\ClassB;
   use com\tutorialspoint\ClassC as C;

   use function com\tutorialspoint\fn_a;
   use function com\tutorialspoint\fn_b;
   use function com\tutorialspoint\fn_c;

   use const com\tutorialspoint\ConstA;
   use const com\tutorialspoint\ConstB;
   use const com\tutorialspoint\ConstC;

   // PHP 7+ code
   use com\tutorialspoint\{ClassA, ClassB, ClassC as C};
   use function com\tutorialspoint\{fn_a, fn_b, fn_c};
   use const com\tutorialspoint\{ConstA, ConstB, ConstC};

?>

Desde PHP 7, se ha cambiado el manejo y la generación de informes de errores. En lugar de informar errores a través del mecanismo tradicional de informe de errores utilizado por PHP 5, ahora la mayoría de los errores se manejan lanzando excepciones de error. De manera similar a las excepciones, estas excepciones de error aparecen hasta que alcanzan el primer bloque de captura coincidente. Si no hay bloques coincidentes, entonces un controlador de excepciones predeterminado instalado conset_exception_handler()sera llamado. En caso de que no haya un controlador de excepciones predeterminado, la excepción se convertirá en un error fatal y se manejará como un error tradicional.

Como la jerarquía de errores no se extiende desde Exception, el código que usa bloques catch (Exception $ e) {...} para manejar excepciones no detectadas en PHP 5 no manejará tales errores. Un bloque catch (Error $ e) {...} o unset_exception_handler() handler es necesario para manejar errores fatales.

Ejemplo

<?php
   class MathOperations {
      protected $n = 10;

      // Try to get the Division by Zero error object and display as Exception
      public function doOperation(): string {
         try {
            $value = $this->n % 0;
            return $value;
         } catch (DivisionByZeroError $e) {
            return $e->getMessage();
         }
      }
   }

   $mathOperationsObj = new MathOperations();
   print($mathOperationsObj->doOperation());
?>

Produce la siguiente salida del navegador:

Modulo by zero

PHP 7 introduce una nueva función intdiv(), que realiza la división entera de sus operandos y devuelve la división como int.

Ejemplo

<?php
   $value = intdiv(10,3);
   var_dump($value);
   print(" ");
   print($value);
?>

Produce la siguiente salida del navegador:

int(3) 
3

Desde PHP7 +, session_start() La función acepta una serie de opciones para anular las directivas de configuración de sesión establecidas en php.ini. Estas opciones admitensession.lazy_write, que está activado de forma predeterminada y hace que PHP sobrescriba cualquier archivo de sesión si los datos de la sesión han cambiado.

Otra opción agregada es read_and_close, lo que indica que los datos de la sesión deben leerse y luego la sesión debe cerrarse inmediatamente sin cambios. Por ejemplo, Establecersession.cache_limiter a privado y establezca el indicador para cerrar la sesión inmediatamente después de leerlo, utilizando el siguiente fragmento de código.

<?php
   session_start([
      'cache_limiter' => 'private',
      'read_and_close' => true,
   ]);
?>

Las siguientes funciones están obsoletas y pueden eliminarse de futuras versiones de PHP.

Constructores de estilo PHP 4

Los constructores de estilo PHP 4 son métodos que tienen el mismo nombre que la clase en la que están definidos, ahora están en desuso y se eliminarán en el futuro. PHP 7 emitirá E_DEPRECATED si un constructor de PHP 4 es el único constructor definido dentro de una clase. Las clases que implementan un método __construct () no se ven afectadas.

Ejemplo

<?php
   class A {
      function A() {
         print('Style Constructor');
      }
   }
?>

Produce la siguiente salida del navegador:

Deprecated: Methods with the same name as their class will not be constructors 
in a future version of PHP; A has a deprecated constructor in...

Llamadas estáticas a métodos no estáticos

Las llamadas estáticas a métodos no estáticos están en desuso y pueden eliminarse en el futuro.

Ejemplo

<?php
   class A {
      function b() {
         print('Non-static call');
      }
   }
   A::b();
?>

Produce la siguiente salida del navegador:

Deprecated: Non-static method A::b() should not be called statically in...
Non-static call

opción de sal de contraseña_hash ()

La opción de sal para el password_hash()La función ha quedado obsoleta para que los desarrolladores no generen sus propias sales (normalmente inseguras). La función en sí genera una sal criptográficamente segura, cuando el desarrollador no proporciona sal, por lo que ya no se requiere la generación de sal personalizada.

capture_session_meta opción de contexto SSL

los capture_session_metaLa opción de contexto SSL ha quedado obsoleta. Los metadatos SSL ahora se utilizan a través destream_get_meta_data() función.

Las siguientes extensiones se han eliminado de PHP 7 en adelante:

  • ereg
  • mssql
  • mysql
  • sybase_ct

Los siguientes SAPI se han eliminado de PHP 7 en adelante:

  • aolserver
  • apache
  • apache_hooks
  • apache2filter
  • caudium
  • continuity
  • isapi
  • milter
  • nsapi
  • phttpd
  • pi3web
  • roxen
  • thttpd
  • tux
  • webjames