С чего вдруг? Это же сокращённый аналог isset, а не empty. https://secure.php.net/manual/ru/la...on.php#language.operators.comparison.coalesce
PHP: <?php $a = 0; echo $a ?? 1; // 0 echo $a ?: 1; // 1, но выдаст нотис на несуществующую переменную Короче, ни что не совершенно ))
привет страна https://php.net/manual/ru/language.operators.comparison.php#language.operators.comparison.ternary @romach лучше бы в 3 часа ночи спал...
@MouseZver Мне нравится сокращение, но я его не использую этот тернарный оператор, хотя и запись короче становится.
Два слова - обратная совместимость. Хотел было написать про нулькоалесцентный оператор, фейспалмнув на то, что его в первом же комменте не упомянули, но, @mkramer спас положение. Спасиб те, милчеловек. А то, блин, три страницы полемики из-за такой простой хрени --- Добавлено --- Оператор "??" - не тернарный, а нулькоалесцентный. Не путай их никогда. Они совершенно разные. Так, например, ты можешь писать $a ?? $b ?? $c ?? $d ?? 'Пыщ' В JS роль нулькоалесцента вполняет обычное логическое ИЛИ, оно же ||. Ввиду того, что в JS логические операции, по возможности, возвращают не TRUE, а значение трушного операнда. И это широко используется. В итоге, выражение a = b || 3 можно буквально читать как "присвоить переменной a значение переменной b или число три, если переменная b пуста или не существует". Но в JS такой подход таки спотыкается об значимые false и 0. В PHP пошли своим путем и, вместо перегрузки || запилили оператор ??, лишенный вышеописанных недостатков. Пользуйтесь им и будьте счастливы.
От себя добавлю - нужно, при этом, не забывать класть ошибки в лог. А то бывают перцы, которые эррор логи папача/fpm отключают вместе с аккцессами, "патамушта в интернете так сововают, штобы праизвадительнасть расла, у миня ж хайловад ажидается!!!" А кастомное логгирование написать не подумали. А потом приходят на форум с просьбами помочь с неизвестной ошибкой, а на вопрос "что в логах", отвечают, блиять, "а в логах пусто.."
@Fell-x27 а я говорил не про ?? нулькоалесцентный а про ? чтобы я не увидел разницы между ? и ?? это уж через чур а еще есть в php 7 вот такое ?: по моему это empty если не прав поправь меня)))
?: это краткая форма записи тернарного оператора: Код (Text): (condition)?(if_true):(if_false) , у которого опущена средняя часть. То есть, в случае, если condition==true, будет возвращен именно он. Звучит неплохо, но в реальной жизни не везде применимо. Если речь идет о проверках на isset, то в принципе не применимо. Нулькоалесцентный же ведет себя по-другому. Он просто идет слева-направо по операндам в выражении, и возвращает первый попавшийся не null-операнд. При этом значимые 0 и false не являются причиной для "неожиданного поведения" и не будут пропущены или приведены к null во время проверки. --- Добавлено --- И нет, тернарный оператор, в свою очередь, не является "краткой формой IF", как некоторые его называют.
@MouseZver ну в примере надо объявление $a убрать и тогда окажется, что нотис дает только второй оператор. --- Добавлено --- почему?
PHP: function foo() { echo 'foo'; return true; } function bar() { echo 'bar'; return true; } function baz() { echo 'baz'; return true; } baz() ? bar() : throw new Exception(); // syntax error, unexpected 'throw' (T_THROW) baz() ?: foo(); // baz baz() ?? foo(); // baz baz() ? bar() : foo(); // bazbar
Потому что: 1) В ветках if ты можешь писать произвольный код. В тернарном операторе - только выражения. 2) У веток if нет прямого назначения. У тернарного оператора каждая ветвь обязана вернуть значение. 3) Возврат значения в ветках тернарного оператора производится автоматически, без return. 4) Тернарный оператор может быть частью любого другого выражения. IF - не может. 5) Назначение IF - ветвление логики. Назначение тернарного оператора - возврат значения по условию. 6) Вот это вот: PHP: if ($condition){ $var = val1; } else{ $var = val2; } Не тернарный оператор. Это нельзя использовать вместо него. Это совершенно иначе пускает логику построения выражения, заставляя рвать его на части, что усложняет поддержку, порой, сильнее, чем грамотно составленные вложенные тернарники. Вот, краткой записью чего является тернарный оператор: PHP: function tern($cond, $if_true, $if_false){ if ($cond){ return $if_true; } else{ return $if_false; } } Это не просто if, как видишь. Это один частный случай использования оного, не более того. Один из бесконечного количества. Но именно этот частный случай настолько востребован, что для него запилили более удобный синтаксис еще во времена Си. Вот и все. Вышеописанный код может заменить тернарник на 100% просто заменой в выражении. Лишь на основании того, что и у if и у тернарного оператора есть понятие логических веток, нельзя говорить, что одно является краткой формой другого.
Что не так? PHP: <?php function tern($cond, $if_true, $if_false){ if ($cond){ return $if_true; } else{ return $if_false; } } $var = 1; $val1 = tern($var , print 'Ok!' , false); $val2 = $var ? print 'Ok!' : false; echo '<hr>'; var_dump($val1,$val2); Я не вижу разницы в поведении, а ты?
Не, @Fell-x27, кстати, разница есть в конкретно твоём случае. С тернарником print "OK" не будет вычисляться если $var ложно, и OK выведено не будет, а с функцией выполнится в обоих случаях. Поэтому твой функциональный аналог тернарника не совсем точен.
Ох, окей. Тогда все еще лучше: в качестве параметров нужно будет передавать анонимную функцию, которая будет выполняться по условию. В итоге синтаксис станет окончательно монструозным. И все равно это будет не то же, что и тернарник
Ты просто не понимаешь всех тонкостей и изыска в таком чуде (с) вырвать, вставить и снова вырвать, и глаза за копикейшен.
Там такого нету. Там есть место за которое я бы вырывал руки, но там оно оправдано (и есть пояснение что обычно такое делать нельзя) (причём код был написан во времена РНР 5.0 и почти без изменений дожил до РНР7, неплохо для кода написанного "одной рукой с закрытыми глазами")
нотисы в постах как и тут у афтара с написанным со времен 5.0 кодом --- Добавлено --- ай сори долблюсь в глаза там везде array_key_exists
Там проблема лишь в том что в БД хранятся уже обработанные данные, а не исходник. Но там это оправдано ибо обработаны они почти без потерь и при случае (например переписывая под MySQL или ещё что) можно конвертануть всё обратно (даже была версия под SQLite но смысла нет) и такое хранение упрощает модерацию (тупо в блокноте можно редактировать всю базу) в обсуждаемом коде данные кастрируются стриптагсом при том что этого можно (нужно) избежать. Опять же мой скрипт был написан по фану, там много что можно изменить, но в силу того где он стоит в этом нет никакой нужды, там работает прицып "и так сойдёт"