
Null coalesce ??
Este operador, cuyo nombre se puede traducir como «fusión de null», es una mejora del conocido como operador Elvis, que es a su vez una mejora del operador ternario.
operador Elvis: En ciertos lenguajes de programación de computadoras, el operador de Elvis, a menudo escrito ?:, or o ||, es un operador binario que devuelve su primer operando si ese operando se evalúa a un valor verdadero, y de lo contrario evalúa y devuelve su segundo operando. El operador de Elvis es una variante del operador condicional ternario , ? :en el sentido de que la expresión con el operador de Elvis A ?: B es aproximadamente equivalente a la expresión con el operador ternario A ? A : B.
Un ejemplo muy habitual del operador ternario podría ser algo así:
$var = isset($_GET['foo']) ? $_GET['foo'] : "default_value";
El operador Elvis (por su simbología ?:), lo pone más fácil:
$var = $_GET['foo'] ?: "default_value";
Pero en este último caso obtendríamos un error tipo E_NOTICE si $_GET['foo']no está definido. El nuevo operador fusión de null soluciona este problema y podemos hacer lo siguiente:
$var = $_GET['foo'] ?? "default_value";
// equivalente al operador ternario
// $var = isset($_GET['foo']) ? $_GET['foo'] : "default_value";
La diferencia: el operador fusión de null devuelve el valor del primer operando si existe y no es NULL, de lo contrario devuelve el segundo operando. Es decir, se comprueba isset() en el primer operando y por ello expresiones como $_GET['foo'] ?? "" no generarán ningún tipo de error.Y, al igual que en el operador ternario, se pueden utilizar expresiones, funciones y llamadas a métodos. Por ejemplo:
$default_object = 0;
$id = 452;
$object = ObjectModel::get($id) ?? $default_object;
// equivalente a
// if (($object = ObjectModel::get($id)) === NULL) { $object = $default_object; }
Y además se pueden encadenar todos los operandos que deseemos y se leerán de izquierda a derecha:
$a = NULL;
$b = NULL;
$c = 100;
$d = $a ?? $b ?? $c;
var_dump( $d ); // int(100)
En este último ejemplo, podemos ver como el null coalesce nos permite construir expresiones en las que dar prioridad a una secuencia de datos y a la vez proveer un valor predeterminado, un fallback en caso de que no existan los valores anteriores. Muy útil para comprobar inputs, configuraciones, etc.Spaceship: <=>
El operador de comparación combinada, de apodo spaceship (nave espacial) por la forma de su símbolo <=>, es un operador binario pero que realiza tres comparaciones. Consta de dos operandos separados por <=> y comprueba si:
- Operando de la izquierda es menor (<) que el operando de la derecha: devuelve el valor -1.
- Ambos operandos son iguales (=): devuelve el valor 0 (cero).
- Operando de la izquierda es mayor (>) que el operando de la derecha: devuelve el valor 1.
function comparison( $a, $b ) {
return $a <=> $b;
}
var_dump( comparison( 2, 3 ) ); // -1
var_dump( comparison( 3, 2 ) ); // 1
var_dump( comparison( 8, 8 ) ); // 0
var_dump( comparison( 4.2, 0.8 ) ); // 1
var_dump( comparison( "c", "a" ) ); // 1
var_dump( comparison( [1,2,3], [1,2,3] ) ); // 0
var_dump( comparison( [1,2,4], [1,2,3] ) ); // 1
A disfrutar!!
Comentarios