it-swarm.com.ru

Использование тернарного оператора без оператора 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?

17
Longblog

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

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

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

ОБНОВЛЕНИЕ

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

$new_variable = $testing ?? '';

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

19
Daan

Просто установите его на NULL, например так:

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

Переменная you возвращает false с проверкой isset().

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

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

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

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

  • ему было присвоено постоянное значение NULL.
  • для еще не установлено какое-либо значение.
  • это было не установлено ().
7
Rizier123

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

isset($testing) ? $new_variable = $testing : NULL;
0
Arnaud Anato