查询

SplSubject::detach()函数—用法及示例

「 从观察者列表中移除一个观察者 」


函数名:SplSubject::detach()

适用版本:PHP 5 >= 5.1.0, PHP 7

函数描述:SplSubject::detach() 方法用于从观察者列表中移除一个观察者。

用法:SplSubject::detach(SplObserver $observer) : void

参数:

  • $observer: 要移除的观察者对象,必须实现 SplObserver 接口。

返回值:无返回值。

示例:

class User implements SplSubject {
    private $observers = [];

    public function attach(SplObserver $observer) {
        $this->observers[] = $observer;
    }

    public function detach(SplObserver $observer) {
        $key = array_search($observer, $this->observers, true);
        if ($key !== false) {
            unset($this->observers[$key]);
        }
    }

    public function notify() {
        foreach ($this->observers as $observer) {
            $observer->update($this);
        }
    }
}

class EmailObserver implements SplObserver {
    public function update(SplSubject $subject) {
        echo "Email sent to user\n";
    }
}

class LogObserver implements SplObserver {
    public function update(SplSubject $subject) {
        echo "User activity logged\n";
    }
}

// 创建用户对象
$user = new User();

// 创建观察者对象
$emailObserver = new EmailObserver();
$logObserver = new LogObserver();

// 将观察者对象添加到用户对象的观察者列表中
$user->attach($emailObserver);
$user->attach($logObserver);

// 通知观察者
$user->notify();

// 从观察者列表中移除一个观察者
$user->detach($logObserver);

// 再次通知观察者
$user->notify();

输出结果:

Email sent to user
User activity logged
Email sent to user

在上面的示例中,我们创建了一个用户对象 User,并实现了 SplSubject 接口。然后,我们创建了两个观察者对象 EmailObserverLogObserver,并实现了 SplObserver 接口。

首先,我们将这两个观察者对象添加到用户对象的观察者列表中,然后调用 notify() 方法通知观察者。观察者收到通知后会执行相应的操作,输出结果中可以看到 "Email sent to user" 和 "User activity logged"。

接着,我们使用 detach() 方法从观察者列表中移除了一个观察者对象 LogObserver。再次调用 notify() 方法通知观察者,可以看到只有 "Email sent to user" 被输出,"User activity logged" 不再出现,说明成功移除了观察者对象。

补充纠错
上一个函数: SplSubject::notify()函数
下一个函数: SplSubject::attach()函数
热门PHP函数
分享链接