PHP7 Null Coalescing или сокращение if/then Evaluate, а не return

В течение долгого времени я хотел иметь возможность сделать это без небольшого лишнего мусора:

$test = 'test';
echo !empty($test2) ? 'something before ' . $test2 : '';

Это вернет пустую строку, потому что $test2 не определено.

$test = 'test';
$test2 = 'test2';

echo !empty($test2) ? 'something before ' . $test2 : '';

Это возвращает "Something before test2", когда определено $test2.

Неважно, изменится ли : ''; на : false; или : null;, потому что здесь все они будут оцениваться как пустая строка. Так что это действительно было дело. Почему нельзя сделать if/then, а только if/then/else?

С оператором двойного знака вопроса ?? в PHP7, объединяющим нуль, кажется, что он приближается к тому, чтобы сделать это. Но я не думаю, что этот оператор действительно помогает.

$test = 'test';
$test2 = 'test2';

echo $test2 ?? 'test3';

У нас "если $test2 не null, то просто сразу вернуть". Поэтому мы не можем добавить к нему "Something before".

Тернарный оператор ?: имеет похожую проблему, когда этот сценарий невозможен, поскольку он немедленно возвращает истинное значение. Я не особо возражаю против !empty(), так как это имеет смысл, почему это необходимо, но всегда прибавлять : ''; кажется довольно грубым для общего шаблона...


person groovenectar    schedule 18.10.2018    source источник
comment
reddit.com/r/PHP/comments/98rz1j/   -  person Furgas    schedule 18.10.2018
comment
Но в чем собственно вопрос?   -  person Furgas    schedule 18.10.2018
comment
@Furgas, чтобы использовать переменную, ее нужно установить .. поэтому мы обычно проверяем это с помощью !empty() ... Это решит множество распространенных случаев, если вы сможете проверить это условие, и если оно выполнено, используйте переменная (либо echo, либо assign). Итак, учитывая, что нам просто нужно сначала протестировать переменную, чтобы попробовать и использовать ее, часто нам не нужен этот случай else... И, похоже, нет другого способа это :( Хорошие ссылки, однако!   -  person groovenectar    schedule 29.10.2018


Ответы (1)


Да, это возможно, используйте оператор &&.

$test = 'test';
$test2 = 'test2';

!empty($test2) && ($test2 = 'something before ' . $test2);

Вторая половина строки будет выполняться только в том случае, если первая половина разрешится как true.

ИЗМЕНИТЬ

Следует отметить, что это, вероятно, плохая практика, так как это может затруднить чтение, но это работает.

ИЗМЕНИТЬ 2

Плохо, это будет работать только в том случае, если вторая половина может быть разрешена как логическое значение, поэтому не будет работать для эха, но будет работать для присваивания.

person Jamie - Fenrir Digital Ltd    schedule 18.10.2018
comment
Я протестировал это, и кажется, что оно захлебывается эхом, syntax error, unexpected 'echo' (T_ECHO) ... Но я вижу, к чему вы клоните, я не уверен, почему оно не анализируется... Вот демонстрация, просто нажмите «Выполнить». Код: sandbox.onlinephpfunctions.com/code/ .. Спасибо, что поделились своими идеями! Я думаю, что для присваивания это может быть достаточно читаемо, но я понимаю, что вы имеете в виду. Похоже, это может быть более читабельно, чем echo !empty($test2) ? 'something before ' . $test2 : '';, что, я думаю, довольно распространено. - person groovenectar; 29.10.2018
comment
Это будет анализировать: if (!empty($test2)) echo 'something before ' . $test2;, но это не решает случай присваивания, потому что мы не можем сделать что-то вроде $test3 = if (!empty($test2)) 'something before ' . $test2; - person groovenectar; 29.10.2018