Назначить, задана ли переменная
В PHP я часто пишу код так:
$a = isset($the->very->long->variable[$index])
? $the->very->long->variable[$index]
: null;
Есть ли более простой способ сделать это? Предпочтительно тот, который не требует, чтобы я дважды писал $the->very->long->variable[$index]
.
Ответы
Ответ 1
К сожалению нет, потому что RFC отклонен. И поскольку isset не является функцией, а конструкцией языка, вы не можете написать свою собственную функцию для этого случая.
Примечание. Поскольку это конструктор языка, а не функция, его нельзя вызывать с помощью переменных функций.
Ответ 2
Обновление, потому что PHP 7 теперь вышел и является игровым устройством в этой точке; предыдущие ответы касаются PHP 5.
PHP 7 решает эту проблему. Потому что вы прав, говоря, что часто писать это на PHP, и это абсолютно не изящно.
В PHP 7 появился Null Coalesce Operator (RFC), который является прекрасным сокращением для термального состояния isset.
Его цель - заменить этот тип условия:
$var = isset($dict['optional']) ? $dict['optional'] : 'fallback';
Таким образом:
$var = $dict['optional'] ?? 'fallback';
Более того, операторы нулевого коалесцирования могут быть сгруппированы:
$x = null;
# $y = null; (undefined)
$z = 'fallback';
# PHP 7
echo $x ?? $y ?? $z #=> "fallback"
# PHP 5
echo isset($x) ? $x : (isset($y) ? $y : $z)
Оператор нулевой коалесценции действует точно так же, как isset()
: значение переменной объекта принимается, если:
- Определяется переменная (она существует)
- Переменная не является нулевой
Просто примечание для начинающих PHP: если вы используете тернарное условие, но знаете, что предметная переменная обязательно определена (но вы хотите получить резервную ошибку для значений ложности), там Elvis оператор:
$var = $dict['optional'] ?: 'fallback';
При использовании оператора Elvis, если $dict['optional']
является недопустимым смещением или $dict
равен undefined, вы получите предупреждение E_NOTICE
(PHP 5 и 7). Вот почему, на PHP 5, люди используют отвратительный isset a? a: b, если они не уверены в вводе.
Ответ 3
Предполагая, что вы знаете, что $the->very->long->variable
установлен, и вас просто беспокоит индекс массива....
$x = $the->very->long->variable;
$a = isset($x[$index]) ? $x[$index] : null;
Или для более общего варианта, который вы можете использовать вокруг кода:
function array_valifset($arr,$k, $default=null) {
return isset($arr[$k]) ? $arr[$k] : $default;
}
затем вызовите его так, как это для любого значения массива:
$a = array_valifset($the->very->long->variable,$index);
Ответ 4
Если вы назначаете null
вместо переменной, не заданной, вы можете использовать:
$a = @$the->very->long->variable[$index];
@
заставляет эту команду не вызывать ошибок
Ответ 5
Я наткнулся на ту же проблему и обнаружил, что обращение к элементу массива не приводит к уведомлению или предупреждению, но возвращает null (по крайней мере, PHP 5.6).
$foo = ['bar' => 1];
var_dump($bar = &$foo['bar']); // int 1
var_dump($baz = &$foo['baz']); // null
Внутри оператора if:
if($bar = &$foo['bar']) {
echo $bar;
}
if($baz = &$foo['baz']) {
echo $baz;
}