php: write isset функция, которая возвращает значение или ноль

У меня есть следующий код во многих местах (тысячи мест) вокруг моего проекта:

$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 до того, как функция была даже вызвана.

Любые идеи о том, как я написал бы такую ​​функцию? Это вообще возможно?

Я понимаю, что некоторые решения были опубликованы Вот а также Вот, но эти решения только для массивов.

5

Решение

Я наткнулся на ответ на свой вопрос, читая о ссылки 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);

Надеюсь, это поможет любому, кто ищет подобное решение.

7

Другие решения

В PHP 7 появился новый «оператор объединения нулей», который делает именно это. Это двойной ?? такие как:

$foo = $mixed ?? null;

Увидеть http://php.net/manual/en/migration70.new-features.php

3

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
2

Вы могли бы просто написать это так:

$foo = $mixed?:null;
0
function f(&$v)
{
$r = null;

if (isset($v)) {
$r = $v;
}

return $r;
}
-1

Если вы просто хотите проверить, существует ли он, сделайте это

function myIsset($mixed)
{
return isset($mixed); // this is a boolean so it will return true or false
}
-2
По вопросам рекламы [email protected]