PHP 7, algo de lo nuevo

10 Ene

Bueno, hace unos días salió a la luz la nueva versión de PHP7, tan esperada, y con mucho para aprender sumergiéndose en este fantástico lenguaje de programación, tan sencillo y liviano, como tan útil para realizar nuestras aplicaciones web.

A continuación dejo el link con la documentación de esta nueva versión:

http://php.net/manual/es/migration70.php

Bien, como una forma de resumir, de lo que estuve viendo en estos días, mostraré algunos cambios que se realizaron de los que me han parecido más interesantes. Debo reconocer, que desde mi punto de vista, se han mejorado muchas cosas de este lenguaje.

Declaraciones de tipo escalar

Bien, desde ahora PHP ya puede ser un lenguaje tipado, osea que al ingresar un valor, por ejemplo en funciones o métodos, podemos (aunque no es obligatorio) ingresar el tipo de dato como parámetro y el de retorno:

Ésta es una función común y corriente de PHP:

<?php
function saludar($nombre, $edad){
   return "Hola, me llamo {$nombre} y tengo {$edad} años";
}
echo saludar('Fernando', 30);

Nada nuevo, una función que recibe un parámetro $nombre y otro $edad. Sin embargo, como PHP hasta versión anteriores era débilmente tipado, muchas veces ingresar cadenas o números daba lo mismo. Lo cual nos permitía realizar malas prácticas como:

echo saludar(555, '30');

Aquí donde va a una cadena de texto (nombre) ingresamos un número, y donde va un número (edad) ingresamos una cadena.

Para solucionar este problema podemos definir tanto a los parámetros de la función, como al retorno de la misma su tipo de dato:

function saludar(string $nombre, int $edad) : string{
   return "Hola, me llamo {$nombre} y tengo {$edad} años";
}
echo saludar('Fernando', 30);

Sin embargo seguimos teniendo el mismo problema de antes, ya que PHP sigue siendo por defecto un lenguaje en donde no es necesario aclarar el tipo de dato, para romper con esto de una vez por todas, debemos agregar a la cabecera:

declare(strict_types=1);

Ahora podemos hacer esto:

declare(strict_types=1);
function saludar(string $nombre, int $edad) : string{
   return "Hola, me llamo {$nombre} y tengo {$edad} años";
}
echo saludar('Fernando', 30);

Pero no podemos hacer esto:

<?php
declare(strict_types=1);
function saludar(string $nombre, int $edad) : string{
 return "Hola, me llamo {$nombre} y tengo {$edad} años";
}
echo saludar(555, '30');

Ya que el resultado será un Fatal Error 🙁

 

Clases anónimas

En PHP7 ya podemos crear clases anónimas, por ejemplo:

$anonima = new class(7, 'PHP') {
   private $numero;
   private $cadena;
   public function __construct($p_numero, $p_cadena){
      $this->numero = $p_numero;
      $this->cadena = $p_cadena;
   }
   public function getNumero(){
      return $this->numero;
   }
   public function getCadena(){
      return $this->cadena;
   }
};
echo $anonima->getCadena() . '-' . $anonima->getNumero();

Aquí vemos como directamente a la variable $anonima la convertimos en un objeto de una clase que nosotros creamos directamente.

Esto tiene cierta utilidad, por ejemplo en Java existe algo llamado sub clase, que son básicamente clases dentro de otras clases. Con las clases anónimas podemos hacer algo como esto:

class Fabrica {
   public function fabricarMesa($p_color, $p_patas){
      return new Class($p_color, $p_patas){
         private $color;
         private $patas;
         public function __construct($p_color, $p_patas){
            $this->color = $p_color;
            $this->patas = $p_patas;
         }
         public function getColor(){
            return $this->color;
         }
         public function getPatas(){
            return $this->patas;
         }
      };
   }
}
$fabrica = new Fabrica();
$mesa1 = $fabrica->fabricarMesa('Marrón', 4);
$mesa2 = $fabrica->fabricarMesa('Negra', 8);
echo 'La mesa 1 es de color ' . $mesa1->getColor() . ' y tiene: ' . $mesa1->getPatas() . ' patas.';
echo '<br />';
echo 'La mesa 2 es de color ' . $mesa2->getColor() . ' y tiene: ' . $mesa2->getPatas() . ' patas.';

En este ejemplo podemos ver como el método fabricarMesa(), nos devuelve un objeto de una clase creada ahí mismo, no necesitamos tener las clases por separado, dentro de una clase ya podemos crear otras clases.

 

Operador de fusión de null

El nombre es raro, pero básicamente se trata de algo que viene a facilitar la entrada de variables que pueden existir o no. Si llevas unos años programando en PHP, seguro te habrá resultado medio molesto hacer esto cuarenta mil veces:

$nombre = isset($_POST['nombre']) ? $_POST['nombre'] : null;

Al no saber la existencia de una variable, debíamos preguntar con el operador ternario en conjunto con la función isset(), si la variable exista recibía un valor, si no podía recibir otro, por ejemplo null. En PHP7 esto puede simplificarse de la siguiente manera:

$nombre = $_POST['nombre'] ?? null;

O bien:

$nombre = $_POST['nombre'] ?? $_POST['nombre'] ?? null;

Un ejemplo con un formulario podría ser:

<?php
   $nombre = $_POST['nombre'] ?? 'Anónimo';
?>
<!DOCTYPE html>
<html>
   <head>
      <title> Operador de fusión de null  </title>
   </head>
   <body>
      <form action="" method="post">
         <label> Nombre </label>
         <input type="text" name="nombre" value="<?php echo $nombre ?>" />
         <input type="submit" value="Guardar" />
      </form>
   </body>
</html>

 

Constantes con valores arrays

Anteriormente las constantes sólo podías ser string, number o boolean. Sin embargo en esta nueva versión ya podemos declarar arrays:

<?php
 define('FRUTAS', [
    'Banana',
    'Manzana', 
    'Naranja'
 ]);
 echo FRUTAS[1]; //Esto devuelve 'Manzana'

También podrían ser arrays asociativos:

<?php
 define('FOCOS', [
    'foco1' => true,
    'foco2' => false,
    'foco3' => true,
 ]);
 foreach(FOCOS as $foco => $estado){
    echo $foco . ' está ' . (($estado) ? 'Encendido' : 'Apagado') . ' <br />';
 }

Bueno, acá algunos ejemplos, pueden seguir aprendiendo de la documentación de la página de PHP. Por mi parte haré lo propio, y seguiré subiendo el material que me parezca interesante.

Saludos!

Redes sociables

    Deja un comentario

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


    *