PHP. Есть ли способ получить значение переменной, если оно установлено?

Я всегда ловлю себя на том, что пишу что-то вроде:

if(isset($var))
{
    DoSomethingWith($var);
}
else
{
    DoSomethingWith(null);
}

or

if(isset($arr["key"]))
{
    DoSomethingWith($arr["key"];
}
else
{
    DoSomethingWith(null);
}

Мой вопрос именно в этом:

Есть ли способ написать функцию get_var_if_set(), чтобы вы могли просто написать...

DoSomethingWith(get_var_if_set($var));
/// and
DoSomethingWith(get_var_if_set($arr["key"]));

....БЕЗ уведомления, если $var не существует или что $arr не имеет заданного значения для «ключа»?

Я думаю, это должно быть что-то вроде этого:

function get_var_if_set($a)
{
    return (isset($a) ? $a : null);
}

Но это не работает, потому что вызов get_var_if_set() с неустановленными переменными всегда будет генерировать Notice, так что может понадобиться немного магии.

Спасибо всем.

Редактировать Пользователь, который удалил свой ответ, предложил передавать переменные по ссылке, так как PHP передаст null, если $variable не существует.

Так что это было бы идеально, взгляните на эти решения (которые, вероятно, могут быть эквивалентными):

function get_var_if_set(&$a) { return (isset($a) ? $a : null); }
function get_var_if_set(&$a) { return $a ?? null; } // Only in PHP 7.0+ (Coalescing operator)

Примечание. Оператор объединения предложен Koray Küpe.

Проблема, как вы видите, заключается в том, что они каким-то образом инициализируют переданные переменные в операторе return. Мы не хотим этого.


person J. Brown    schedule 08.05.2017    source источник
comment
В новом документе сравните echo $a; и echo @$a;. Хотя я думаю, что подавление ошибок вообще не очень хорошая вещь.   -  person Lucas Krupinski    schedule 08.05.2017
comment
Вы можете просто использовать: DoSomethingWith($var??null); или DoSomethingWith($var?:null);   -  person Thamilhan    schedule 08.05.2017
comment
@LucasKrupinski, какая польза от @ перед переменной?   -  person Antonios Tsimourtos    schedule 08.05.2017
comment
@AntonisTsimourtos - @ подавляет ошибки   -  person Lucas Krupinski    schedule 08.05.2017
comment
@AntonisTsimourtos используется для подавления ошибок и предупреждений.   -  person programmingArrow    schedule 08.05.2017
comment
@Тамилан Это очень полезно! Спасибо   -  person J. Brown    schedule 08.05.2017
comment
Просто используйте это return($a)?$a:null;   -  person Kamran Khatti    schedule 08.05.2017
comment
функция get_var_if_set($a=null) { return $a; } Может быть, это то, что вы хотите сделать здесь, функция устанавливает значение аргумента по умолчанию равным null, поэтому, если вы введете значение, оно будет возвращено, иначе функция вернет null, но полезно ли это   -  person Osama    schedule 08.05.2017
comment
@LucasKrupinski на самом деле я не хотел подавлять, используя этот @!   -  person J. Brown    schedule 08.05.2017
comment
@sunilwananje Я тоже не хотел этой дополнительной операции! Но спасибо обоим за игру! знак равно   -  person J. Brown    schedule 08.05.2017
comment
@KamranKhatti нет   -  person J. Brown    schedule 08.05.2017
comment
@Осама тоже нет   -  person J. Brown    schedule 08.05.2017


Ответы (2)


Если вы используете PHP 7.0+, вы можете использовать оператор объединения null.

return $a ?? null;

Примечание. Оператор проверяет, существует ли переменная и не является ли она пустой. Таким образом, если переменная уже установлена, но пуста, она уже вернет нулевую переменную.

person Koray Küpe    schedule 08.05.2017
comment
Это умно, но выдает уведомления! Проблема в том, что когда вы выполняете call_a_function_with($some_unexistent_parameter);, PHP злится. Мне нужна волшебная функция, которая сообщает PHP. Неважно, что мне передано, существует оно или нет, я создан для работы с неопределенными индексами и неизвестными переменными. - person J. Brown; 08.05.2017

Проблема не в самой переменной, а в ключе массива key в этом:

DoSomethingWith(get_var_if_set($arr["key"]))

Таким образом, единственным решением является проверка массива и ключа, который вы ищете.

function get_var_if_set($a, $key = null)
{
    if(is_array($a) && array_key_exists($key, $array)) {
        return $a[$key]; 
    } else {
          return (isset($a) ? $a : null);
    }
}
person napolux    schedule 08.05.2017
comment
Крутость функции isset() в том, что вы можете дать ей то, чего не существует, и в лучшем случае вы получите false; PHP знает, что isset() может получить несуществующие переменные, и не уведомляет об этом. Мне нужна своего рода функция-оболочка для isset, которая дает вам напрямую [значение или ноль], а не [истина или ложь]. Ваше решение игнорирует проблему, заключающуюся в том, что если вы вызываете get_var_if_set($inexistent_var), PHP сообщает вам (с уведомлением), что $inexistent_var не существует. - person J. Brown; 08.05.2017