在setter方法中实现isset()

时间:2010-11-30 06:49:14

标签: php oop

有没有办法在setter方法中实现isset()?也就是说,让setter方法检查变量是否存在?从我可以说不,但希望有人可以为我确认。简而言之,我希望避免这样做

if (isset($arr[0])) $foo->setId($arr[0])

只是做

$foo->setId($arr[0])

以某种方式在setter方法中实现isset()逻辑。谢谢!

5 个答案:

答案 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值,则由于增加的开销和潜在错误而存在缺陷,但这可能会略微减少代码量。