Heavily cribbed from Midori Kocak

Heavily cribbed from Midori Kocak


PHP RFC: Null Coalescing Assignment Operator


Combined assignment operators have been around since 1970's, appearing first in the C Programming Language. For example, $x = $x + 3 can be shortened to $x += 3. With PHP being a web focused language, the ?? operator is often used to check something's existence like $username = $_GET['user'] ?? 'nobody'; However, because variable names are often much longer than $username, the use of ?? for self assignment creates repeated code, like $this->request->data['comments']['user_id'] = $this->request->data['comments']['user_id'] ?? ‘value’;. It is also intuitive to use combined assignment operator null coalesce checking for self assignment.


Despite ?? coalescing operator being a comparison operator, coalesce equal or ??=operator is an assignment operator. If the left parameter is null, assigns the value of the right paramater to the left one. If the value is not null, nothing is made.

// The folloving lines are doing the same
$this->request->data['comments']['user_id'] = $this->request->data['comments']['user_id'] ?? 'value';
// Instead of repeating variables with long names, the equal coalesce operator is used
$this->request->data['comments']['user_id'] ??= 'value';

The value of right-hand parameter is copied if the left-hand parameter is null.

Proposed PHP Version(s)

This proposed for the next PHP 7.x.

Patches and Tests

A pull request with a working implementation, targeting master, is here: https://github.com/php/php-src/pull/1795


Rejected Features

Keep this updated with features that were discussed on the mail lists.


An option needs 2/3 votes to win

Approve Equal Null Coalesce Operator RFC and merge patch into master? (90.2% approved)
User Vote
aharvey Yes
ajf No
brianlmoon Yes
colinodell Yes
daverandom Yes
davey Yes
dmitry Yes
dragoonis Yes
francois Yes
frozenfire Yes
galvao Yes
guilhermeblanco Yes
jwage Yes
klaussilveira Yes
krakjoe No
laruence No
lcobucci Yes
leigh Yes
levim No
lstrojny Yes
malukenho Yes
marcio Yes
mariano Yes
mbeccati Yes
mcmic Yes
mrook Yes
ocramius Yes
patrickallaert Yes
pauloelr Yes
pierrick Yes
pollita Yes
ralphschindler Yes
stas Yes
svpernova09 Yes
toby Yes
tpunt Yes
trowski Yes
weierophinney Yes
yohgaki Yes
zeev Yes
zimt Yes