У меня есть следующий код во многих местах (тысячи мест) вокруг моего проекта:
$foo = isset($mixed) ? $mixed : null;
куда $mixed
может быть любым: массив, элемент массива, объект, свойство объекта, скаляр и т. д. Например:
$foo = isset($array['element']) ? $array['element'] : null;
$foo = isset($nestedArray['element']['key']) ? $nestedArray['element']['key'] : null;
$foo = isset($object->prop) ? $object->prop : null;
$foo = isset($object->chain->of->props) ? $object->chain->of->props : null;
Есть ли способ написать эту повторяющуюся логику как (простую) функцию? Например, я попробовал:
function myIsset($mixed)
{
return isset($mixed) ? $mixed : null;
}
Вышеприведенная функция выглядит так, как будто она будет работать, но на практике это не так. Например, если $object->prop
не существует, и я звоню myIsset($object->prop))
то я получаю фатальную ошибку: Undefined property: Object::$prop
до того, как функция была даже вызвана.
Любые идеи о том, как я написал бы такую функцию? Это вообще возможно?
Я понимаю, что некоторые решения были опубликованы Вот а также Вот, но эти решения только для массивов.
Я наткнулся на ответ на свой вопрос, читая о ссылки php. Мое решение заключается в следующем:
function issetValueNull(&$mixed)
{
return (isset($mixed)) ? $mixed : null;
}
Вызовы этой функции теперь выглядят так:
$foo = issetValueNull($array['element']);
$foo = issetValueNull($nestedArray['element']['key']);
$foo = issetValueNull($object->prop);
$foo = issetValueNull($object->chain->of->props);
Надеюсь, это поможет любому, кто ищет подобное решение.
В PHP 7 появился новый «оператор объединения нулей», который делает именно это. Это двойной ?? такие как:
$foo = $mixed ?? null;
Увидеть http://php.net/manual/en/migration70.new-features.php
isset
это языковая конструкция, а не обычная функция. Следовательно, он может принять то, что в противном случае могло бы вызвать ошибку, и просто вернуть false.
Когда вы звоните myIsset($object->prop))
, оценка происходит, и вы получаете ошибку.
Увидеть http://php.net/manual/en/function.isset.php
Это та же проблема, что и при использовании typeof nonExistentVariable
в JavaScript. typeof
является языковой конструкцией и не приведет к ошибке.
Однако, если вы попытаетесь создать функцию, вы получите ошибку при попытке использовать неопределенную переменную.
function isDef(val) {
return typeof val !== 'undefined';
}
console.log( typeof nonExistent !== 'undefined'); // This is OK, returns false
isDef(nonExistent); // Error nonExistent is not defined
Вы могли бы просто написать это так:
$foo = $mixed?:null;
function f(&$v)
{
$r = null;
if (isset($v)) {
$r = $v;
}
return $r;
}
Если вы просто хотите проверить, существует ли он, сделайте это
function myIsset($mixed)
{
return isset($mixed); // this is a boolean so it will return true or false
}