复制PHP的函数isset

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

我想要的是复制当前 PHP 中的 isset() 函数并将其更改为我想要的功能。问题在于我无法在 PHP 源代码中找到实际的 isset() 函数...
许多框架都使用像我在第一个示例中展示的 isset() 函数,我无法想象我是第一个遇到这个问题的人。
所以我的问题是:
  1. 在哪里可以找到实际的 isset() PHP 函数?
  2. 在哪里可以找到实际的 isset() C 函数(真正的实现)?
  3. 如何更改代码以返回值或指定的默认值?

3
为什么?猜测是因为你传递的是引用而不是值,所以需要设置一个值。 - Jonnix
3
顺便一提,创建一个替代的isset()函数并不能防止PHP在访问未设置的变量/索引时抛出警告。 - Touki
如果C语言中的isset函数可以接受不存在的变量,那么C语言中的该函数的副本也可以。这就是我想要在核心中复制isset函数的全部原因。 - Raymond
3个回答

3
为什么要这样做?只需删除&即可:
function __isset($aVariable, $aDefault = null) {
    return isset($aVariable) ? $aVariable : $aDefault;
}

1
如果你移除&符号,就会得到一个Notice: Undefined offset错误。 - Baba
我认为警告是一个单独的问题。 - Jonnix
1
我们的编程方式是确保完全没有任何提示、警告或错误。因此,这不是一个选择。我们也不使用 @ 抑制错误消息,因为在某些情况下会导致不良后果。 - Raymond
@Raymond,好的,没有通知,也没有@。所以你要修改语言核心并重新编译它,使得所有你的脚本都不兼容普通的PHP。有趣。 - Petr
@Petr,我觉得你这么说很有趣...自定义PHP编译,或添加PHP扩展或Apache扩展,以哪种方式与正常的PHP不兼容?您只是在添加函数,而扩展就是为此而发明的! - Raymond

0

移除&符号单独会生成Notice: Undefined offset: 4 in。我认为你应该移除&并使用@来抑制任何E_NOTICE错误

$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

问题在于,您必须在所有函数调用中放置“@”,而不是函数本身。 - Petr
我们正在编程,确保不会出现任何提示、警告或错误。因此,这不是一个选择。我们也不使用 @ 抑制错误信息,因为这在某些情况下会导致不良结果。 - Raymond
同时覆盖isset函数并不是我们想要的...isset返回布尔值,我们想要返回值或默认值。由于isset函数是PHP中唯一允许传递不存在变量的函数,因此这是一个特殊的函数。这就是为什么我们想在C中复制它的原因。 - Raymond

0

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

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

确保你必须修改 __isset 来特殊处理数组


人们使用我上面描述的函数的原因是他们不想为了可读性而编写这样的代码,否则我也可以这样做:$lValue = isset($lArray[4]) ? $lArray[4] : 'D'; - Raymond

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接