PHP 7 – Lo nuevo


Si yo cambio, todo cambia

Si yo cambio, todo cambia dijo PHP hace un año atrás y hoy casi lanza su más reciente versión, con cambios y ambiciones que ameritan el número de la suerte, el 7.

En la primera entrega de esta serie introductoria sobre PHP7 abordamos un poco el tema principal de este nuevo release, el rendimiento y su notable mejora con respecto a sus predecesores, asi como comparativas en cuanto a su mas grande competidos HHVM.

Pero no solo se refactorizó el lenguaje, también llegan nuevas características que vienen como dulces a nosotros los chicos desarrolladores que tanto gustamos de comparar, opinar y hacer nuestra cada una de las preferidas. También decimos adiós a viejas costumbres y pequeños guerreros que en nuestros inicios sirvieron bien, pero que el tiempo implacable poco a poco fue dejando al olvido.

Nuestros viejos guerreros

Una vez clasificado como deprecated en el ciclo PHP pasado, el futuro se vuelve incierto, casi inexistente. Conocidas extensiones como ext/mysql o funciones como preg_replace() se fueron desvaneciendo hasta el olvido en esta entrega #7.

Aquí les listamos algunas de las más conocidas. Si todavía haces uso de ellas creo que es hora de que vayas estudiando las alernativas que propone PHP. La lista completa pueden encontrarla en la RFC.

  • ext/ereg (desde PHP 5.3; reemplazo ext/pcre)
  • ext/mysql (desde PHP 5.5; reemplazo ext/mysqli o ext/pdo_mysql)
  • mcrypt_ecb, mcrypt_cbc, mcrypt_cfb and mcrypt_ofb (desde PHP 5.5; reemplazo mcrypt_encrypt and mcrypt_decrypt )
  • preg_replace() (desde PHP 5.5; reemplazo preg_replace_callback)

Lo nuevo

Pero los nuevos juguetes son el sentido verdadero del número de la suerte. ¿Realmente necesario, cumple lo que promete, qué esperar? Bueno esas se las dejo a su concideración, yo por mi parte disfruto de cada nueva promesa que nos traerá la Navidad.

Tipo de dato en el retorno

Nada nuevo si vienes de lenguajes como C++ o Java. El tipo de retorno es obligatorio en muchos de los llamados C like no así en PHP. Las declaraciones de tipo de devolución especifican el tipo del valor que será devuelto por una función.

function sumarArrays(array ...$arrays): array
{
return array_map(function(array $array): int {
return array_sum($array);
}, $arrays);
}
print_r(sumarArrays([1,2,3], [4,5,6], [7,8,9]))

El tipo de retorno se agrega en la sintaxis de la función al final de la declaración de la misma. Precedido por (:) En el ejemplo se devuelve una lista, es decir un arreglo. En el ejemplo que sigue a continuación el retorno será un objeto, una clase llamada C que será instanciada y retornada como resultado.

class C {}

function getC(): C {
return new C;
}
var_dump(getC());

En el caso de que el tipo de retorno no coincida con el tipo retornado real, PHP lanzará un error como el siguiente:

Fatal error: Uncaught TypeError: Return value of example_function() must be of the type , returned in – on line …

Los tipos de datos disponibles en el retorno aparecen listados y bien documentados en la documentación online de PHP bajo el título Declaraciones de Tipo.

Operador de fusión de null

Para que tengan una idea, todos hemos usado una línea como la siguiente alguna vez, seguramente más de una vez por proyecto:

$resultado = isset($_GET['resultado']) ? $_GET['resultado'] : 'no_existe';

Las variantes son muchas pero básicamente la utilización de un operador ternario como isset() ofrece esas posibilidades. Bueno el operador de fusión ofrece una alternativa, mismo objetivo, mismo resultado… más elegancia.

$resultado = $_GET['resultado'] ?? 'no_existe';

Se pone más interesante pues la fusión se puede encadenar:

$resultado = $_GET['resultado'] ?? $_POST['resultado'] ?? 'no_existe';

Donde el orden de asignación sería como el siguiente:

resultado = $_GET['resultado'] OR $_POST['resultado'] OR 'no_existe'

Sencillamente genial.

Arrays constantes

Imaginen una lista que no cambiará durante el curso de su aplicación. Casos de usos, existen muchos.

define(‘LENGUAJES’, [
‘C++’,
‘Java’,
‘PHP’
]);

echo LENGUAJES[1];

Importante, la declaración debe realizarse con define()

División entera

Digamos que deseas dividir 10/3 y el retorno un número entero. No es difícil claro está:

$resultado = (int) 10 / 3 // O quizás redondear con round()

Pues la función intdiv() ha sido introducida para manejar divisiones donde se va a devolver un número entero.

El operador nave espacial

La traducción (original de PHP) al español realmente nos da alas a la imaginación. Pero la realidad es que es solo un operador de comparación. Bueno, decir solo quizás le quite un tanto de mérito, lo cual no es mi intención. Realmente, útil.

// Números enteros
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1

// Numeros decimales
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1

// Cadenas de caracteres
echo “a” <=> “a”; // 0
echo “a” <=> “b”; // -1
echo “b” <=> “a”; // 1

Los ejemplos posteriores los copié fielmente de la documentación online de PHP, transmiten exactamente las características y posibilidades de este operador. Lo primero que deben de tener en cuenta es que la comparación se basa en las reglas de comparación de tipos usuales de PHP. Devuelve un integer menor, igual, o mayor que cero cuando $a es respectivamente menor, igual, o mayor que $b.

 

Son muchos los cambios y las nuevas implementaciones, ideas y las que están pendiente a implementación antes de que salga la versión definitiva. Nosotros les hemos traído 5 de las de uso más frecuentes por llamarles de alguna forma. Pero existen otras, quizás mas interesantes para ustedes. El uso de clases anónimas, el trabajo con Unicode o la declaración de use en grupo. Todas pueden encontrarlas en la RFC bien documentadas y explicadas.

Como siempre la opción es de ustedes, comentenos sus experiencias si ya ha hecho uso de algunos de los releases BETA de PHP7 o sus inquietudes si solo es un lector curioso ávido de información del futuro. Estamos aquí por ustedes.

Latest posts by Leroy Ley (see all)