I'm a big fan of null coalesce, but I want more. There are definitely times where I want to set a default value if a variable is "empty". Perl has two coalesce operators:
$num ||= 8; # Empty coalesce $num //= 8; # null/undef coalesce
Any chance PHP will get any sort of empty coalesce operator? Right now I'm writing out:
if (empty($num)) { $num = 8; }which is a lot more typing, not chainable, and less readable? It'd be really nice to be able to do something like:
$num = $cost ||| $prev_num ||| $default_val;
Where ||| is the operator I made up for empty coalesce.
Elvis
?:returns the first argument if it contains a "true-ish" value (see which values are considered loosely equal totruein the first line of the Loose comparisons with == table). Or the second argument otherwise$result = $var ?: 'default'; // is a shorthand for $result = $var ? $var : 'default';Null coalescing
??returns the first argument if it's set and is notnull. Or the second argument otherwise$result = $var ?? 'default'; // is a shorthand for $result = isset($var) ? $var : 'default';
When your first argument is null, they're basically the same except that the null coalescing won't output an E_NOTICE when you have an undefined variable. The PHP 7.0 migration docs has this to say:
The null coalescing operator (??) has been added as syntactic sugar for the common case of needing to use a ternary in conjunction with isset(). It returns its first operand if it exists and is not NULL; otherwise it returns its second operand.
Here's some example code to demonstrate this:
<?php
$a = null;
print $a ?? 'b'; // b
print "\n";
print $a ?: 'b'; // b
print "\n";
print $c ?? 'a'; // a
print "\n";
print $c ?: 'a'; // Notice: Undefined variable: c in /in/apAIb on line 14
print "\n";
$b = array('a' => null);
print $b['a'] ?? 'd'; // d
print "\n";
print $b['a'] ?: 'd'; // d
print "\n";
print $b['c'] ?? 'e'; // e
print "\n";
print $b['c'] ?: 'e'; // Notice: Undefined index: c in /in/apAIb on line 33
print "\n";
The lines that have the notice are the ones where I'm using the shorthand ternary operator as opposed to the null coalescing operator. However, even with the notice, PHP will give the same response back.
Execute the code: https://3v4l.org/McavC
Of course, this is always assuming the first argument is null. Once it's no longer null, then you end up with differences in that the ?? operator would always return the first argument while the ?: shorthand would only if the first argument was truthy, and that relies on how PHP would type-cast things to a boolean.
So:
$a = false ?? 'f'; // false
$b = false ?: 'g'; // 'g'
would then have $a be equal to false and $b equal to 'g'.
Ran the below on php interactive mode (php -a on terminal). The comment on each line shows the result.
var_export (false ?? 'value2'); // false
var_export (true ?? 'value2'); // true
var_export (null ?? 'value2'); // value2
var_export ('' ?? 'value2'); // ""
var_export (0 ?? 'value2'); // 0
var_export (false ?: 'value2'); // value2
var_export (true ?: 'value2'); // true
var_export (null ?: 'value2'); // value2
var_export ('' ?: 'value2'); // value2
var_export (0 ?: 'value2'); // value2
The Null Coalescing Operator ??
??is like a "gate" that only lets NULL through.- So, it always returns first parameter, unless first parameter happens to be
NULL. - This means
??is same as( !isset() || is_null() )
Use of ??
- shorten
!isset() || is_null()check - e.g
$object = $object ?? new objClassName();
Stacking Null Coalese Operator
x ??
z;
// This is a sequence of "SET && NOT NULL"s:
if( $x && !is_null($x) ){
return $x;
} else if( $y && !is_null($y) ){
return $y;
} else {
return $z;
}
The Ternary Operator ?:
?:is like a gate that letsanything falsythrough - includingNULL- Anything falsy:
0,empty string,NULL,false,!isset(),empty() - Same like old ternary operator:
X ? Y : Z - Note:
?:will throwPHP NOTICEon undefined (unsetor!isset()) variables
Use of ?:
- checking
empty(),!isset(),is_null()etc - shorten ternary operation like
!empty(tox : $y
y
- shorten
if(!$x) { echo $x; } else { echo $y; }toechoy
Stacking Ternary Operator
echo 0 ?: 1 ?: 2 ?: 3; //1
echo 1 ?: 0 ?: 3 ?: 2; //1
echo 2 ?: 1 ?: 0 ?: 3; //2
echo 3 ?: 2 ?: 1 ?: 0; //3
echo 0 ?: 1 ?: 2 ?: 3; //1
echo 0 ?: 0 ?: 2 ?: 3; //2
echo 0 ?: 0 ?: 0 ?: 3; //3
// Source & Credit: http://php.net/manual/en/language.operators.comparison.php#95997
// This is basically a sequence of:
if( truthy ) {}
else if(truthy ) {}
else if(truthy ) {}
..
else {}
Stacking both, we can shorten this:
if( isset($_GET['name']) && !is_null($_GET['name'])) {
$name = $_GET['name'];
} else if( !empty($user_name) ) {
$name = $user_name;
} else {
$name = 'anonymous';
}
To this:
$name = $_GET['name'] ?? $user_name ?: 'anonymous';
Cool, right? :-)
How does the null coalescing operator work in PHP?
What is the syntax of the null coalescing operator?
$variable = $value ?? $default;
Here, $value is checked first. If it is null, $default is used instead.