4

我已经使用自定义__isset()函数很长时间了,它基本上只是为了让代码看起来更好并节省输入时间:

function __isset(&$aVariable, $aDefault = null) {
    return isset($aVariable) ? $aVariable : $aDefault;
}

但是今天我发现这个函数实际上是在创建不存在的变量!当您检查数组属性时,这是一个大问题:

$lArray = ('A', 'B', 'C');
$lValue = __isset($lArray[4], 'D');
print_r($lArray); // Outputs 0=>'A', 1=>'B', 2=>'C', 3=>NULL

所以我想要的是isset()从 PHP 复制当前函数并将其更改为我想要的。isset()问题是我在 PHP 源代码中找不到实际的函数......

许多框架都在使用isset()我在第一个示例中展示的功能,我无法想象我是第一个遇到这个问题的人。

所以我的问题是:

  1. 我在哪里可以找到实际的isset()PHP 函数?
  2. 我在哪里可以找到实际的isset()C 函数(真正的实现)?
  3. 如何更改代码以使其返回值或指定的默认值?
4

3 回答 3

3

为什么这一切?删除&,就是这样:

function __isset($aVariable, $aDefault = null) {
    return isset($aVariable) ? $aVariable : $aDefault;
}
于 2012-10-04T09:44:33.383 回答
0

删除&标志alone会产生Notice: Undefined offset: 4 in我认为你应该做的是删除&并抑制任何E_NOTICE error@;

$lArray = array('A', 'B', 'C');
$lValue = __isset(@$lArray[4], 'D'); // or @__isset($lArray[4], 'D');

var_dump($lValue);
var_dump($lArray);

function __isset($aVariable, $aDefault = null) {
    return isset($aVariable) ? $aVariable : $aDefault ;
}

输出(没有 E_NOTICE 错误)

string 'D' (length=1)
array
  0 => string 'A' (length=1)
  1 => string 'B' (length=1)
  2 => string 'C' (length=1)

另一种解决方案是使用另一个isset来管理数组和对象

$lArray = array('A','B','C');
$lValue = __issetComplex($lArray, 4, 'D');

var_dump($lValue);
var_dump($lArray);


function __issetComplex($mixed, $key, $aDefault = null) {
    if (is_array($mixed))
        return array_key_exists($key, $mixed) ? $mixed[$key] : $aDefault;
    if (is_object($mixed))
        return isset($mixed->key) ? $mixed->key : $aDefault;
    return $aDefault;
}

最后,您可以自己覆盖 PHP isset 函数,请参阅override_function

于 2012-10-04T10:03:01.243 回答
0

使用array_key_exist在实际比较之前检查数组键是否存在

$lArray = array('A','B','C');
$LValue = array_key_exists(2, $lArray)?$lArray[2]:'D';
echo $LValue;

确保您必须将 __isset 修改为特殊的句柄数组

于 2012-10-04T09:42:46.220 回答