2015-04-03 15:38:48 2900次浏览 1条回答 0 悬赏 10 金钱
public function off($name, $handler = null)
{
    $this->ensureBehaviors();
    if (empty($this->_events[$name])) {
        return false;
    }

    // $handler === null 时解除所有的handler
    if ($handler === null) {
        unset($this->_events[$name]);
        return true;
    } else {
        $removed = false;

        // 遍历所有的 $handler
        foreach ($this->_events[$name] as $i => $event) {
            if ($event[0] === $handler) {
                unset($this->_events[$name][$i]);
                $removed = true;
            }
        }
        if ($removed) {
            $this->_events[$name] = array_values($this->_events[$name]);
        }
        return $removed;
    }
}

这个是源码, $removed最后的判断,是把自己的值再赋给自己。。为什么会这么写?

补充于 2015-04-03 15:48

http://www.digpage.com/event.html#handler 这个网上的资源,看到这个问题。

  • 回答于 2015-04-03 20:01 举报

    要是怀疑它有问题,你要说明它可能发生的问题。
    要是觉得它多此一举,我试着解释下:
    首先你说把自已的值赋给自已,但它在赋给自已之前,
    $remove=true,即值发生了变化,在赋值时是通过array_values()在进行处理,自然是消除因值unset之后引起的索引不连续。若问为什么要这样处理,只好回答为什么不这么处理。

    1 条回复
    回复于 2015-04-03 21:32 回复

    嗯,消除因值unset之后引起的索引不连续。没考虑到这个,回头再了解一下unset()的内部

您需要登录后才可以回答。登录 | 立即注册
qway
见习主管

qway 广州

注册时间:2015-01-23
最后登录:2015-05-22
在线时长:10小时40分
  • 粉丝1
  • 金钱105
  • 威望0
  • 积分205

热门问题