有没有办法在setter方法中实现isset()
?也就是说,让setter方法检查变量是否存在?从我可以说不,但希望有人可以为我确认。简而言之,我希望避免这样做
if (isset($arr[0])) $foo->setId($arr[0])
只是做
$foo->setId($arr[0])
以某种方式在setter方法中实现isset()
逻辑。谢谢!
答案 0 :(得分:3)
不,你不能下标一个缺少的数组元素并期望它能够工作。下标将在发送到方法之前进行评估。这意味着在方法收到参数之前,下标将失败。
$arr = array(0 => 'a', 1 => 'b', 2 => 'c');
如果我$foo->setId($arr[0])
,那么$foo->setId()
会收到a
作为字符串,它永远不会知道它是从数组中下标的(不是它想知道的)。
因此$foo->setId($arr[3])
会出错...
未定义的偏移量
答案 1 :(得分:1)
没有
您只是将$arr[0]
的值传递给setter方法,而不是$arr[0]
变量。 $foo::setId
不知道$arr
或$arr[0]
是否存在,只能看到它的价值。
这对封装来说是件好事!想象一下,如果每个函数都必须检查其参数是否确实存在:
function setId($id) {
// $id is defined, it's required (has no default value),
// and yet I can't be sure it actually exists here...?
}
在将其值传递给函数之前,您必须检查变量是否存在。
答案 2 :(得分:1)
首先,阅读@ alex的answer。 (编辑:同时阅读@ deceze的answer)
为了模仿你想要的东西你可以分别传递数组和索引:
$foo->setId($arr, 0);
更改setId()
方法的签名(或添加safeSetId()
):
function safeSetId($array, $index) {
if (isset($array[$index])) {
$this->setId($array[$index]);
}
}
这不非常漂亮,但是:)
答案 3 :(得分:1)
Isset
不是函数:它是一种语言结构。语言结构被允许做魔术;用户定义的函数不能。
没有isset
本身没有办法重新实现isset
逻辑(至少没有修改PHP的源代码)。如果您尝试在函数内部实现它,如果该变量不存在,则您收到的参数将为null
,并且在您的函数之前将引发E_NOTICE
错误甚至叫。
答案 4 :(得分:0)
虽然由于已经给出的原因你无法实现你想要做的事情,你仍然可以使代码更简洁,只需很少的开销。
如果setId()函数可以处理null或者它只是设置一个成员变量(默认情况下会初始化为null),你可以编写一个简单的实用函数,如下所示:
function getValue($array, $key, $default = null) {
return isset($array[$key]) ? $array[$key] : $default;
}
然后像这样打电话给你的二传手:
$foo->setId(getValue($arr,0));
同样,如果您的setter方法需要非null值,则由于增加的开销和潜在错误而存在缺陷,但这可能会略微减少代码量。