Подтвердить что ты не робот

Назначить, задана ли переменная

В PHP я часто пишу код так:

$a = isset($the->very->long->variable[$index])
            ? $the->very->long->variable[$index]
            : null;

Есть ли более простой способ сделать это? Предпочтительно тот, который не требует, чтобы я дважды писал $the->very->long->variable[$index].

4b9b3361

Ответ 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;
}