2016-11-15 5 views
2

Я был очень доволен, когда узнал о нулевом коалесцирующем операторе php7. Но теперь, на практике, я вижу, что это не то, что я думал, что это:PHP non-falsy null coalesce operator

$x = ''; 
$y = $x ?? 'something'; // assigns '' to $y, not 'something' 

Я хочу что-то вроде либо С # ?? оператора или питона or оператора:

x = '' 
y = x or 'something' # assings 'something' to y 

Есть ли стенография эквивалентно для этого в php?

+0

'$ у = $ х: 'что-то','? Всегда задано '$ x'? –

+0

Если вы сравниваете это с Python '' или '...'?: 'То, что вы хотите. В противном случае вам нужно будет выяснить, существует ли '$ x', или вам нужно избегать ошибок, если это не так. – deceze

+0

Нет, он может быть недоступен в контексте. –

ответ

2

Нет, не существует фальшивочного оператора коалесценции для PHP, но есть обходное решение. Знакомства ??0?::

<?php 

$truly = true; // anything truly 
$false = false; // anything falsy (false, null, 0, '0', '', empty array...) 
$nully = null; 

// PHP 7's "null coalesce operator": 
$result = $truly ?? 'default'; // value of $truly 
$result = $falsy ?? 'default'; // value of $falsy 
$result = $nully ?? 'default'; // 'default' 
$result = $undef ?? 'default'; // 'default' 

// but because that is so 2015's...: 
$result = !empty($foo) ? $foo : 'default'; 

// ... here comes... 
// ... the "not falsy coalesce" operator! 
$result = $truly ??0?: 'default'; // value of $truly 
$result = $falsy ??0?: 'default'; // 'default' 
$result = $nully ??0?: 'default'; // 'default' 
$result = $undef ??0?: 'default'; // 'default' 

// explanation: 
($foo ?? <somethingfalsy>) ?: 'default'; 
($foo if set, else <somethingfalsy>) ? ($foo if truly) : ($foo if falsy, or <somethingfalsy>); 

// here is a more readable[1][2] variant: 
??''?: 

// [1] maybe 
// [2] also, note there is a +20% storage requirement 

Источник:
https://gist.github.com/vlakoff/890449b0b2bbe4a1f431

+1

Я поеду с версией 2015 года, спасибо очень много. Если вы и каждый будущий вкладчик в кодовую базу не используете '?? 0?:' Каждый день, вы будете царапать свою голову на 6 месяцев подряд, пытаясь понять, что это делает. – deceze

+1

Я лично считаю, что это тоже очень непроницаемо. – sepehr