PHP is a web-focussed programming language, so processing user data is a frequent activity. In such processing it is common to check for something's existence, and if it doesn't exist, use a default value. Yet the simplest way to do this, something along the lines of isset($_GET['mykey']) ? $_GET['mykey'] : "" , is unnecessarily cumbersome. The short ternary operator, ?: provides a way to do this much more conveniently: $_GET['mykey'] ?: "" . However, this is not good practice, as if the value does not exist it will raise an E_NOTICE . Because of these issues, some sort of ifsetor() operator or a modification to ?: 's behaviour to make this common pattern easier has been a frequent request (See References).

The coalesce, or ?? , operator is added, which returns the result of its first operand if it exists and is not NULL, or else its second operand. This means the $_GET['mykey'] ?? "" is completely safe and will not raise an E_NOTICE. Some examples of its use:

// Fetches the request parameter user and results in 'nobody' if it doesn't exist $username = $_GET [ 'user' ] ?? 'nobody' ; // equivalent to: $username = isset($_GET['user']) ? $_GET['user'] : 'nobody'; // Calls a hypothetical model-getting function, and uses the provided default if it fails $model = Model :: get ( $id ) ?? $default_model ; // equivalent to: if (($model = Model::get($id)) === NULL) { $model = $default_model; } // Parse JSON image metadata, and if the width is missing, assume 100 $imageData = json_decode ( file_get_contents ( 'php://input' ) ) ; $width = $imageData [ 'width' ] ?? 100 ; // equivalent to: $width = isset($imageData['width']) ? $imageData['width'] : 100;

It can even be chained:

$x = NULL ; $y = NULL ; $z = 3 ; var_dump ( $x ?? $y ?? $z ) ; // int(3) $x = [ "yarr" => "meaningful_value" ] ; var_dump ( $x [ "aharr" ] ?? $x [ "waharr" ] ?? $x [ "yarr" ] ) ; // string(16) "meaningful_value"

This example demonstrates the precedence relative to the ternary operator and the boolean or operator, which is the same as C#:

var_dump ( 2 ?? 3 ? 4 : 5 ) ; // (2 ?? 3) ? 4 : 5 => int(4) var_dump ( 0 || 2 ?? 3 ? 4 : 5 ) ; // ((0 || 2) ?? 3) ? 4 : 5 => int(4)

This example demonstrates how it is a short-circuiting operator: