SplSubject::detach()

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

首字母:S

函数名: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 接口。然后,我们创建了两个观察者对象 EmailObserver 和 LogObserver,并实现了 SplObserver 接口。

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

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

同首字母函数