PHP 7 | Características

Se han agregado muchas características en PHP7. Después del lanzamiento de PHP7, el rendimiento del sitio web aumentó entre un 25 y un 70 %. Ahora discutiremos las características de PHP7 una por una a través del ejemplo.

Sugerencia de tipos de datos escalares : los tipos de datos escalares son booleanos, enteros, flotantes y de string. Anteriormente, no pudimos hacer sugerencias de tipo para el tipo de datos escalar. Estábamos haciendo sugerencias para objetos de clase o array.

Ejemplo:

<?php 
ini_set('display_errors', '1');
  
class User{}
  
function test(User $abc) {
    var_dump($abc);
}
  
test(new User);
?>

Producción:

object(User)#1 (0) {
}

Ahora veamos cómo hacer sugerencias de tipo para un tipo de datos escalares que está disponible en Php7

<?php 
ini_set('display_errors','1');
  
class User{} 
  
function add(int $a, int $b) {
    return $a + $b;
}
  
echo add(3, '34');
?>

Producción:

37

Estamos pasando una string en la segunda string de argumento ’34’ pero el resultado que obtenemos aquí es la suma de 34 y 3, es decir, 37 porque aquí el modo estricto está deshabilitado. Ahora, si desea restringir esto, debe dar una declaración en la parte superior del archivo.
Ejemplo:

<?php 
declare(strict_types = 1);
ini_set('display_errors','1');
  
class User{} 
  
function add(int $a, int $b) {
    return $a + $b;
}
  
echo add(3, '34');
?>

Producción:

Fatal error: Uncaught TypeError: Argument 2 passed to add() must be of the type integer,
string given, called in /home/cg/root/5012177/main.php on line 11 and defined 
in /home/cg/root/5012177/main.php:7
Stack trace:
#0 /home/cg/root/5012177/main.php(11): add(3, '34')
#1 {main}
  thrown in /home/cg/root/5012177/main.php on line 7
PHP Fatal error:  Uncaught TypeError: Argument 2 passed to add() must be of the type integer,
string given, called in /home/cg/root/5012177/main.php on line 11 and defined 
in /home/cg/root/5012177/main.php:7
Stack trace:
#0 /home/cg/root/5012177/main.php(11): add(3, '34')
#1 {main}
  thrown in /home/cg/root/5012177/main.php on line 7

Ahora veamos el ejemplo para Boolean. A continuación se muestra el código para el tipo de datos booleano.
Ejemplo:

<?php 
declare(strict_types = 1);
ini_set('display_errors','1');
  
class User{} 
  
function isBoolean(bool $a) {
    var_dump($a);
}
  
isBoolean(true);
?>

Producción:

bool(true)

Declaración de tipo de devolución: en C o C++, defina el tipo de datos del valor que devolverá la función. Ahora veremos cómo hacer esto en Php7.
Ejemplo:

<?php 
  
declare(strict_types = 1);
ini_set('display_errors','1');
  
function test(): array {
    return[];
}
  
var_dump(test());
?>

Producción:

array(0) {
}

En el ejemplo anterior, después de declarar una función, debe proporcionar el tipo de datos usando: y luego devolver la misma array de tipos de datos en la función test().

Operador Null Coalesce: El operador Null Coalesce es “??”. Este operador reemplaza básicamente al operador ternario. Anteriormente estábamos usando un operador ternario como el siguiente…

<?php 
declare(strict_types = 1);
ini_set('display_errors','1');
  
$name = isset($_GET['name']) ? $_GET['name'] : 'Not Found';
var_dump($name);
?>

Producción:

string(9) "Not Found"

Ahora usando ‘??’ operador podemos acortar el código.
Ejemplo:

<?php 
declare(strict_types = 1);
ini_set('display_errors','1');
  
$name = $_GET['name'] ?? 'Not Found';
var_dump($name);
?>

Producción:

string(9) "Not Found"

Importaciones y espacios de nombres a tientas: anteriormente, cuando teníamos que definir múltiples espacios de nombres y clases y usar o importar una clase de un espacio de nombres a otro espacio de nombres, se usaba la palabra clave ‘usar’ y luego teníamos que dar el espacio de nombres con el nombre de la clase que necesita para importar.
Ejemplo:

<?php 
  
namespace Course {
    class BTech {
    }
   
    class MTech {
    }
}
   
namespace Course\Branch {
       
     // CSE is in both Course
     // BTech and MTech
     class CSE {
     }   
}
   
namespace App {
      use Course\BTech;
      use Course\MTech;
      use Branch\CSE;
      var_dump(new BTech());
      var_dump(new MTech());
}
  
?>

Producción:

object(Course\BTech)#1 (0) {
}
object(Course\MTech)#1 (0) {
}

En el ejemplo anterior, importe dos clases, pero ¿qué sucede si necesita usar varias clases de un espacio de nombres a otro espacio de nombres? Tendrá que escribir varias líneas de declaración de ‘uso’ que definan todas y cada una de las clases, lo que hará que su código sea largo. Entonces, en PHP7 para resolver este problema, se introdujeron las importaciones agrupadas. Veamos cómo funcionará el ejemplo anterior con la ayuda de importaciones agrupadas junto con espacios de nombres anidados.
Ejemplo:

<?php 
   
namespace Course {
    class BTech {
    }
      
    class MTech {
    }
}
   
namespace Course\Branch {
      
     // CSE is in both Course BTech and MTech
     class CSE {
     }   
}
   
namespace App {
   
      use Course\{
          BTech,
          MTech,
          Branch\CSE
      };
   
      var_dump(new BTech());
      var_dump(new MTech());
      var_dump(new CSE());
}
   
?>

Producción:

object(Course\BTech)#1 (0) {
}
object(Course\MTech)#1 (0) {
}
object(Course\Branch\CSE)#1 (0) {
}

Por lo tanto, las importaciones agrupadas reducirán el código y serán más legibles y convenientes.

Operador combinado de comparación/nave espacial: El operador de comparación combinado es la combinación de tres operadores. Estos operadores son menor que, mayor que e igual. Esta combinación de tres ejecuciones de operador y la salida variará según el resultado. Ahora tomemos un ejemplo de este operador.

Ejemplo:

<?php 
   
$arr = ['welcome' ,'to' , 'geeksforgeeks'];
   
usort($arr, function($a, $b) {
    return strlen($a) <=> strlen($b); 
});
   
var_dump($arr);
   
?>

Producción:

array(3) {
  [0]=>
  string(2) "to"
  [1]=>
  string(7) "welcome"
  [2]=>
  string(13) "geeksforgeeks"
}

En el ejemplo anterior, estamos comparando la longitud de las palabras definidas en una array y ordenándolas en orden ascendente. El usort() es una función preconstruida de PHP donde pasa una array como el primer parámetro y el segundo parámetro es una función definida por el usuario que significa su propia función lógica personalizada. Lea más sobre la función usort() en este enlace usort() . Entonces, en lugar de usar manualmente con if y else, podemos usar la nave espacial o el operador combinado para la misma tarea.

Clases anónimas: PHP7 introdujo clases anónimas, ahora la pregunta es ¿cuándo usarlas? Cuando iba a usar una clase solo una vez y no desea que se vuelva a crear una instancia. En primer lugar, veamos cómo creamos normalmente una clase y un objeto.

Ejemplo:

<?php 
class test {
  function hiGeeks() {
      echo "geeksforgeeks";
  }
}
  
$sayGeeks = new test;
$sayGeeks->hiGeeks();
?>

Producción:

geeksforgeeks

Ahora veamos cómo crear una clase anónima.
Ejemplo:

<?php 
$anonymous = new class {
  private $readme  = "Welcome to geeksforgeeks";
  function printOut() {
    echo $this->readme;
  }
};
$anonymous -> printOut();
?>

Producción:

Welcome to geeksforgeeks

Aquí podemos crear un objeto para esta clase pero podemos extender otra clase.
Ejemplo:

<?php 
class test {
    function hiGeeks() {
        echo "geeksforgeeks ";
    }
}
   
$sayGeeks = new test;
$sayGeeks->hiGeeks();
   
$anonymous = new class extends test{
    private $readme  = "Welcome to geeksforgeeks";
    function printOut() {
        echo $this->readme;
    }
};
   
$anonymous -> printOut();
$anonymous -> hiGeeks();
?>

Producción:

geeksforgeeks Welcome to geeksforgeeksgeeksforgeeks

Closure:: call() method: PHP7 introdujo un nuevo método call() que es una forma abreviada de invocar un cierre mientras se le vincula el alcance de un objeto. La mayoría de las veces en JavaScript usamos cierres, que es una función anónima. En PHP 5 también usamos cierres, pero en PHP7 lo usamos de una manera diferente.
Ejemplo:

<?php 
   
class User {
    private $username;
     private $email;
   
public function __construct($username, $email) {
        $this->username = $username;
        $this->email= $email;
    }
}
   
$getUserEmail = function() {
    return $this->username. ' email address is '.$this->email;
};
   
$user = new User('abc','abc@gmail.com');
  
// Using PHP5 
$email = $getUserEmail->bindTo($user, 'User');
echo $email().'  ';
   
// Using PHP7
echo $getUserEmail->call($user);
?>

Producción:

abc email address is abc@gmail.com  abc email address is abc@gmail.com

así que el método call() hace que nuestro código sea más limpio y fácil de usar.

Generador: programar en Php se ha vuelto más poderoso debido a algunas de las nuevas características introducidas como ‘retorno’ con generadores y rendimiento en él. Veremos cómo funciona su jerarquía en PHP7.
Ejemplo:

<?php 
   
function values() {
    yield 200;
    yield 300;
    return 500;
}
   
$control = values();
   
foreach ($control as $value) {
    echo '<br>'. $value;
}
  
echo '<br>'. $control->getReturn();
   
?>

Producción:


200
300
500

En el ejemplo anterior, para obtener el valor de yield estamos usando el ciclo foreach y para obtener el valor de return estamos usando getReturn(). Aquí debemos cuidar el orden para obtener el valor de rendimiento y retorno. Si vamos a cambiar el orden obtendremos un error.
Ejemplo:

<?php 
   
function values() {
    yield 200;
    yield 300;
    return 500;
}
   
$control = values();
   
echo '<br>'. $control->getReturn();
   
foreach ($control as $value) {
    echo '<br>'. $value;
}
   
?>

Producción:

PHP Fatal error:  Uncaught Exception: Cannot get return value of a generator that
hasn't returned in /home/cg/root/6474693/main.php:14
Stack trace:
#0 /home/cg/root/6474693/main.php(14): Generator->getReturn()
#1 {main}
  thrown in /home/cg/root/6474693/main.php on line 14

Entonces, en el ejemplo anterior, estamos tratando de obtener el valor de retorno primero y rendimiento que le dará un error. También en PHP7, permite ceder desde otro generador de funciones. Podemos escribir varias funciones generadoras y puede permitir que se vinculen a otra.

Ejemplo:

<?php 
  
function values() {
      
    yield from Gen2();
      
    yield 300;
      
    return 500;
}
  
function Gen2() {
      
    yield 'This is from Gen2';
      
    yield 'This is from Gen200';
      
    yield from Gen3();
}
  
function Gen3() {
      
    yield 'This is from Gen3';
      
    yield 'This is from Gen300';
}
  
$control = values();
  
foreach ($control as $value) {
      
    echo '<br>'. $value;
}
  
echo '<br>'. $control->getReturn();
  
?>

Producción:


This is from Gen2
This is from Gen200
This is from Gen3
This is from Gen300
300
500

Manejo de errores: los errores y las excepciones implementan la interfaz Throwable. Podemos usar bloques try/catch para manejar objetos de errores y excepciones.

  1. Error de tipo: este error ocurre cuando cierto tipo de error no coincide con una declaración de tipo.
  2. Parse Error: este error ocurre cuando hay un error de sintaxis en el código o en el archivo incluido.
  3. Error de aserción: este error ocurre cuando no se cumple la condición establecida por aserción.

En PHP7 podemos lidiar con el error de una manera elegante y podemos lanzar una excepción cada vez que ocurra. El error fatal anterior a Php7 no invocaba el controlador de errores y detenía el script y no podía cerrar los recursos correctamente. Veamos la interfaz Throwable.

interface Throwable
{
    public function getMessage(): string;
    public function getCode(): int;
    public function getFile(): string;
    public function getLine(): int;
    public function getTrace(): array;
    public function getTraceAsString(): string;
    public function getPrevious(): Throwable;
    public function __toString(): string;
}

A continuación se muestra la sintaxis de cómo usar Throwable en el bloque try/catch.

try {
  // Code
}catch(Throwable $e) {
  // Exceptions or Error handling
}
  1. Manejo de errores fatales: a continuación se muestra el ejemplo para manejar un error fatal de una manera más elegante y también veremos cómo cerrar los recursos correctamente.

    Ejemplo:

    <?php 
       
    class User {
           
        public function __construct() {
            echo 'User Construct...<br>';
        }
           
        public function __destruct() {
           echo 'User Destruct...<br>'
        }
           
    }
       
    function run($object) {
        $object->hello();
    }
       
    try {
        $user = new User();
        run(null);
      
    // Use Error instead of exception to
    // generate custom error message    
    } catch (Error $e) {
        echo '<strong>Error on Line: '.$e->getLine().' in '
            .$e->getFile().'</strong>'. $e->getMessage().'<br>';
    } finally {
        echo 'Finally Ran...<br>';
    }
       
    ?>

    Producción:

    User Construct...
    Error on Line: 16 in /home/cg/root/6474693/main.php Call to a member function hello() on null
    Finally Ran...
    User Destruct...

    Así es como podemos lidiar con un error fatal y podemos cerrar nuestros recursos correctamente y también crear un mensaje personalizado. Si usamos ‘Excepción’ en lugar de ‘Error’ en el bloque catch como ‘catch (Exception $e)’, no obtendremos un mensaje adecuado que hayamos creado desde nuestro lado, así que use Error en lugar de Exception.

  2. Manejo de error de tipo y error de análisis: podemos manejar los errores de tipo y analizar los errores de manera similar a como lo hicimos con el error fatal. Veamos primero cómo manejar el error de tipo . A continuación se muestra el ejemplo en el que estamos tratando de obtener algunos de dos enteros y estamos haciendo sugerencias de tipo.

    Ejemplo:

    <?php 
       
    class User {
           
        public function __construct() {
            echo 'User Construct...<br>';
        }
           
        public function __destruct() {
           echo 'User Destruct...<br>'
        }
           
    }
       
    function sum(int $num1, int $num2) {
        return $num1 + $num2;
    }
       
    try {
        $user = new User();
        echo sum('Test', 2);
    } catch(Exception $e) {
        echo $e->getMessage();
    } catch(Error $e) {
        echo '<strong>'.get_class($e). 'on line '.
            $e->getLine().':</strong>'.$e->getMessage().'<br>';
    }
       
    ?>

    Producción:

     
    User Construct...
    TypeError on line 15:Argument 1 passed to sum() must be of the type integer, string given, called in /home/cg/root/4010040/main.php on line 21
    User Destruct...

    En el ejemplo anterior, estamos pasando una string y un entero que nos está dando un error de tipo debido a la sugerencia de tipo utilizada en nuestra función. Del ejemplo anterior, podemos manejar el error correctamente y también podemos cerrar los recursos aunque tengamos un error. Estamos usando diferentes funciones como get_class(), getLine(), getMessage() para manejar el error de la manera más elegante.

    Ahora, tomemos un ejemplo para manejar el error de análisis . A continuación se muestra el código donde recibiremos el error debido al error de sintaxis en nuestro archivo.

    Ejemplo:

    <?php 
       
    class User {    
        public function __construct() {
            echo 'User Construct...<br>';
        }
           
        public function __destruct() {
           echo 'User Destruct...<br>'
        }
           
    }
       
    function sum(int $num1, int $num2) {
        return $num1 + $num2;
    }
       
    try {
        $user = new User();
          
        // Syntax error for var_dump in below line
        $result = eval("var_dup(1);");
    } catch(Exception $e) {
        echo $e->getMessage();
    } catch(Error $e) {
        echo '<strong>'.get_class($e). ' on line '.$e->getLine()
            .':</strong>'.$e->getMessage().'<br>';
    }
       
    ?>

    Producción:

     
    User Construct...
    Error on line 1:Call to undefined function var_dup()
    User Destruct...

Función de división de enteros: PHP7 introdujo la función intdiv() que toma dos parámetros, uno es dividendo y otro es divisor. El resultado será la división como int.
Ejemplo:

<?php
   $value = intdiv(13,4);
   var_dump($value);
   echo $value;
?>

Producción:

int(3)
3

Publicación traducida automáticamente

Artículo escrito por anuupadhyay y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *