函数名: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" 不再出现,说明成功移除了观察者对象。