Feature: Null Coalescing Variable Handling Construct

php.internals

Robert Chapin

1 year ago
Following a brief discussion on Github today about adding operators, I decided a simple-looking construct is needed and is arguably a better solution for null coalescing comparison. A common challenge: Need to test the value of a variable whose existence is unknown. Existing solutions: |$input = $_POST['input'] ?? 'none'; if ($input === 'yes') echo 'success'; $_POST['input'] ??= 'none'; if ($_POST['input'] === 'yes') echo 'success'; | Needed solution: What we don't have is a Variable Handling Function that will concisely resolve any uninitialized variable. // Hypothetical |if (nullc($_POST['input']) === 'yes') echo 'success'; | The proposed construct nullc(mixed $var): mixed, will return the original value, or null if the variable is not declared.  This is consistent with the construct isset which returns false when a variable is assigned to null.  In this way, the two constructs isset and nullc will complement each other more concisely than something like the construct empty. The other challenge: Null coalescing operator precedence causes unexpected behavior. $test = 'off'; if ($test ?? '' === 'on') {     // The line above is equivalent to if ($test ?? false) and will evaluate as true.     echo 'yes'; } if ('on' === $what ?? '') {     // The line above is equivalent to if (('on' === $what) ?? '') and will throw a warning } This requires an extra set of parentheses to be workable. $test = 'off'; if (($test ?? '') === 'on') {     // The line above will evaluate as false. } These nuances were missed in the former Unary Coalesce RFC. Adding or not adding an operator doesn't resolve the cumbersome precedence already in place for ?? usage.  I was reminded of the need for a function-style construct while contemplating the differences between PHP's ?? operator and Microsoft's function Nz.  What we can do with an expression like nullc($test) === 'on' should be compatible with other existing operators and is more elegant than operators-in-parentheses or any multi-line statements.  This would also resolve the problem of not being able to do the same in a user function. Further reading: https://wiki.php.net/rfc/unary_null_coalescing_operator ------------- Robert Chapin