Использование тернарного оператора без оператора Else PHP

Можете ли вы использовать тернарный оператор в PHP без закрывающего оператора else? Я пробовал, и он возвращает ошибки. Поиск в Google ничего не дает, поэтому я думаю, что ответ, вероятно, отрицательный. Я просто хотел дважды проверить здесь. Например:

if ( isset($testing) {
  $new_variable = $testing;
}

Устанавливает только $ new_variable, если существует $ testing. Теперь я могу сделать

$new_variable = (isset($testing) ? $testing : "");

но это возвращает пустую переменную для $ new_variable, если $ testing не установлено. Мне не нужна пустая переменная, если она не установлена, я хочу, чтобы $ new_variable не создавалась.

Я пытался

$new_variable = (isset($testing) ? $testing);

и он вернул ошибки. Я тоже пробовал

$new_variable = (isset($testing) ? $testing : );

и он также вернул ошибки. Есть ли способ использовать тернарный оператор без прикрепленного оператора else, или я застрял в написании его от руки?

РЕДАКТИРОВАТЬ: Следуя совету Rizier123, я попытался установить для части «else» уравнения значение NULL, но в итоге все равно добавляется ключ к массиву. Ценности нет, но есть ключ, который разрушает мои планы. Пожалуйста, позвольте мне объяснить подробнее.

Код будет брать кучу переменных $ _POST из формы и использовать их для параметров в stdClass, который затем используется для вызовов методов API. Некоторые переменные формы не будут существовать, поскольку все они применяются к одной и той же переменной для вызова API, но пользователь может выбрать только одну. В качестве примера, возможно, вы можете выбрать 3 элемента, какой бы элемент вы ни выбрали, передается в stdClass, а два других не существуют.

Я пробовал это:

$yes_this_test = "IDK";
$setforsure = "for sure";
$list = new stdClass;
$list->DefinitelySet = $setforsure;
$list->MaybeSet = (isset($yes_this_test) ? $yes_this_test : NULL);
$list->MaybeSet = (isset($testing) ? $testing : NULL);
print_r($list);

Но очевидно, что MaybeSet получает значение NULL, потому что (isset ($ testing) идет после (isset ($ yes_this_test) и возвращает

stdClass Object ( [DefinitelySet] => for sure [MaybeSet] => )

Я не буду знать, в каком порядке идут переменные $ _POST, поэтому я не могу структурировать его таким образом, чтобы гарантировать, что список обрабатывается в правильном порядке.

Теперь я знаю, что могу сделать что-то вроде

if ( isset($yes_this_test ) {
  $list->MaybeSet = $yes_this_test;
}
elseif ( isset($testing) ) {
  $list->MaybeSet = $testing;
}

Но я надеялся, что у этого типа логики есть сокращение, так как мне пришлось написать десятки таких логик. Есть ли оператор, похожий на тернарный оператор, используемый для операторов if / elseif?


person Longblog    schedule 31.03.2015    source источник
comment
Другой вариант - использовать оператор if без фигурных скобок. Это может быть одна строка, похожая на троичную. if(isset($testing)) $new_variable = $testing;. IMO Мне не нравится, если без фигурных скобок, но просто говорю, что это возможно. ИМО, было бы лучше просто установить его в NULL, как предлагает Ризье, потому что isset вернет false, если значение равно NULL. isset($nullVar) вернет false.   -  person Jonathan Kuhn    schedule 31.03.2015
comment
Возможный дубликат тернарных операторов. Возможно ли одностороннее действие?   -  person Ani Menon    schedule 27.05.2016


Ответы (4)


Начиная с PHP 5.3, это можно сделать :

!isset($testing) ?: $new_variable = $testing;

Как видите, он использует часть, только если условие ложно, поэтому вы должны отрицать выражение isset.

ОБНОВЛЕНИЕ

Начиная с PHP 7.0 ты можешь сделать это:

$new_variable = $testing ?? null;

Как видите, он возвращает свой первый операнд, если он существует и не равен NULL; в противном случае он возвращает свой второй операнд.

ОБНОВЛЕНИЕ

Поскольку PHP 7.4 вы можете сделать это:

$new_variable ??= $testing;

Он оставляет $new_variable в покое, если он isset, и присваивает ему $testing в противном случае.

person Daan    schedule 29.04.2016
comment
Тот факт, что PHP допускает пустое значение в правдивом слоте, но не в ложном слоте, является смешным. Что происходит в головах специалистов по сопровождению языка PHP? !isset($testing) ? : $new_variable = $testing; но не !isset($testing) ? $new_variable = $testing; - person ahnbizcad; 18.11.2020
comment
@ahnbizcad Это не настоящее пустое значение, это просто синтаксический сахар для использования первого операнда. Я согласен, было бы неплохо иметь эквивалент, который использует null, если третий операнд опущен, но для этого, вероятно, потребуется новый оператор. - person patrickj; 10.04.2021
comment
Может быть, синтаксический сахар - отстой и на самом деле синтаксический аспартам. - person ahnbizcad; 23.04.2021

Просто установите NULL вот так:

$new_variable = (isset($testing) ? $testing : NULL);

Переменная you вернет false при проверке isset().

Вы можете узнать больше о NULL в руководстве.

И цитата оттуда:

Специальное значение NULL представляет собой переменную без значения. NULL - единственное возможное значение типа null.

Переменная считается null, если:

  • ему была присвоена константа NULL.
  • ему еще не присвоено какое-либо значение.
  • он был отключен ().
person Rizier123    schedule 31.03.2015
comment
Идеально! Спасибо. Я всегда предполагал, что NULL почти то же самое, что и пустой. Думаю, мне следует меньше предполагать и больше читать. ;) - person Longblog; 31.03.2015
comment
Ба, на самом деле, после тестирования только сейчас, он все еще добавляет переменную в список, как пустую переменную. Я не знаю, сработает ли это, потому что мне придется использовать его для массива параметров, используя переменные $ _POST в качестве параметров. Я не знаю, в каком порядке будут проходить переменные $ _POST, поэтому я могу получить параметр NULL, даже если одна из переменных $ _POST установлена. Я объясню дальше выше. - person Longblog; 31.03.2015
comment
@Longblog да, просто отредактируйте свой вопрос и вставьте его туда, чтобы я понял, что вы имеете в виду - person Rizier123; 31.03.2015
comment
Хорошо, я добавил дополнительные детали, а также пример. Спасибо за вашу помощь. - person Longblog; 31.03.2015
comment
@Longblog Просто добавьте это в конец: $list = (object) array_filter((array)$list, function ($v){ return !is_null($v); }); И это удалит все значения, которые имеют значение NULL. Проблема в том, что это в классе, так что это похоже на определенное свойство без значения. - person Rizier123; 31.03.2015
comment
Спасибо за ответ Rizier123. Я не думаю, что это решит проблему перезаписи значения переменной значением NULL. Допустим, $ _POST [option1] установлен, а $ _POST [option2] - нет. По мере выполнения моего кода, приведенного выше, $ _POST [option2] перезапишет значение параметра 1, изменив его на нулевое значение. Затем функция, которую вы разместили выше, полностью удалит ее из $ list, и в коде не будет правильной переменной, необходимой для API. Думаю, в этом случае мне придется использовать обычные операторы if / else. Я не вижу выхода, если не существует чего-то, о чем я не подозреваю. - person Longblog; 31.03.2015
comment
Что мне действительно нужно, так это сокращение для оператора, который говорит, что если x установлен, y = x, иначе ничего не делать. Это существует? - person Longblog; 31.03.2015
comment
@Longblog Итак, если я правильно понимаю проблему, у вас есть X переменных POST. Вы проходите через первый, и если он установлен, то result = POST1 и так далее, и если один пост не установлен, он не должен ничего перезаписывать, верно? - person Rizier123; 31.03.2015
comment
Верный. Чтобы уточнить, если есть 3 возможных переменных POST для этой категории, будет установлена ​​только 1. Поэтому я должен назначить тот, который установлен, на заранее определенное имя параметра. У меня не может быть двух, которые не установлены, перезаписать тот, который установлен на NULL или пустой. Я не могу просто назвать все возможные формы ввода для категории одинаковыми (хотя это кажется лучшей идеей) по причинам более сложным, чем у меня есть место для объяснения здесь. Я знаю, что могу сделать это с помощью обычных операторов if / elseif, я просто хотел бы знать, есть ли для этого сокращение. - person Longblog; 31.03.2015
comment
Я думал, что понял это только сейчас и попробовал! $ List- ›MaybeSet как часть else тернарного элемента, но он по-прежнему возвращает MaybeSet как ключ с пустым значением. Дох! - person Longblog; 31.03.2015
comment
Я не совсем уверен, что это то, что вам нужно, и в противном случае я думаю, вам нужно использовать if / else, но попробуйте следующее: $postKeys = ["a", "b", "c"]; $result = array_reduce($postKeys, function($result, $v){ return (isset($_POST[$v])?$_POST[$v]:$result); }, "defaultValue"); Просто заполните массив $postKeys ключами переменных POST, и $result будет содержать окончательное значение (вы также можете установить значение по умолчанию, если все переменные не существуют) - person Rizier123; 31.03.2015
comment
null - это просто допустимое значение в PHP, поэтому ничего не возвращает. - person Daan; 29.04.2016

Начиная с PHP 7.0, вы можете делать следующее, без получения исключения ErrorException Попытка получить свойство roomNumber не-объекта:

$house = new House();
$nr = $house->tenthFloor->roomNumbers ?? 0

Предполагая, что свойство tenthFloor не существует в классе, приведенный выше код не вызовет ошибку. В то время как приведенный ниже код вызовет исключение ErrorException:

$nr = $house->tenthFloor->roomNumbers ? $house->tenthFloor->roomNumbers : 0
person cosmorunner    schedule 21.10.2020

Вы также можете сделать это (краткая форма):

isset($testing) ? $new_variable = $testing : NULL;
person Arnaud Anato    schedule 27.07.2018