Blog de Gonzalo

Php 7

Acabo de migrar mi página web a php 7 y la verdad pensé que iba a ser más crítico. Lo único que he tenido que cambiar es que para conectarse a MySQL hay que usar mysqli o pdo.
Uno de los cambios que me ha sorprendido es el Operador combinado de comparación.
Otro cambio como que me ha gustado es sobre los parámetros de las funciones hay que definir los tipos de los parámetros de entrada y del valor de retorno de la función. Es fácil y sencillo como se explica en el siguiente ejemplo:

function getTotal(float $a, float $b) : float {
.....
return $floatNumber;
}

En el ejemplo anterior se definen que los parámetro de entrada $a y $b son de tipo float y poniendo : float se le indica a la función que el valor que devuelve tiene que ser de tipo float. Si se quisiera que el valor de retorno es float o null habría que poner : ?float, que quiere decir que el valor de retorno puede ser null o float. Igual pasa con los parámetros poniendo "?" delante del tipo se especifica que el parámetro peude ser null o del tipo especificado.
Pero cuidado si se pone que el tipo de retorno es int no da error sino se devuelve un int, para forzarlo hay que usar la directiva declare(strict_types=1);. Voy a poner un ejemplo:
function getTotal(float $a, float $b) : int {
return $a + $b;
}

getTotal(2, "1 week");
// cambia int(2) a float(2.0) y string("1 week") a float(1.0)
// devuelve int(3);

getTotal(2.8, "3.2");
// cambia string "3.2" a float(3.2)
// devuelve int(6)

getTotal(2.5, 1);
// cambia int(1) a float(1.0)
// devuelve int(3)

En el ejemplo anterior se muestra lo que ocurre al no usar la directiva declare(strict_types=1);. En el siguiente ejemplo al ponerla si que se producirá el error correspondiente:
//Ojo: Debe ir al principio del fichero
declare(strict_types=1);

function getTotal(float $a, float $b) : int {
// return $a + $b;
// Fatal error: Uncaught TypeError: Return value of getTotal() must be of the type integer, float returned
return (int)($a + $b); // truncate float like non-strict
} )

La directiva declare(strict_types=1); comprueba que coinciden los tipos en las variables declaradas, en el paso de parámetros en métodos y en la devolución de valores de los métodos y se tiene que poner al principio del fichero, incluso antes de la definicion del namespace. Pero no se puede hacer de manera global, es decir, que hay que añadir esta directiva en todos los ficheros en los que se vaya a utilizar.
Otra novedad es que se reemplaza la extensión json por jsond, se permiten múltiples default en switch, se filtra el unserialize() ya que era un error de seguridad como se especificaba sobre la inyección de objetos.
Otra novedad y que es bastante importante es que es bastante más rápido que las versiones anteriores. El nuevo motor de php convierte todos los errores fatales en excepciones por lo que pueden ser mnajeados por el programador.
Otra novedad es el operador de coalescencia nulo que es una mejora del conocido como operador Elvis, que es a su vez una mejora del operador ternario