php:write isset函数,返回value或null

时间:2015-01-12 22:48:00

标签: php function null default-value 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

关于如何编写这样的函数的任何想法?它甚至可能吗?

我意识到某些解决方案已发布herehere,但这些解决方案仅适用于数组。

6 个答案:

答案 0 :(得分:8)

在阅读php references时,我偶然发现了自己问题的答案。我的解决方案如下:

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);

希望这可以帮助那些寻找类似解决方案的人。

答案 1 :(得分:3)

PHP 7有一个新的" Null合并运算符"这正是这个。这是一个双??如:

$foo = $mixed ?? null;

请参阅http://php.net/manual/en/migration70.new-features.php

答案 2 :(得分:2)

isset是一种语言结构,而不是常规函数。因此,它可以采取原本会导致错误的内容,并返回false。

当您致电myIsset($object->prop))时,会进行评估并收到错误。

请参阅http://php.net/manual/en/function.isset.php

这与在JavaScript中使用typeof nonExistentVariable的问题相同。 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

答案 3 :(得分:0)

你实际上可以这样写:

$foo = $mixed?:null; 

答案 4 :(得分:-1)

function f(&$v)
{
    $r = null;

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

    return $r;
}

答案 5 :(得分:-2)

如果您只想检查是否存在,请执行此操作

function myIsset($mixed)
{
    return isset($mixed); // this is a boolean so it will return true or false
}