PHP Conference Japan 2024

SplObserver 接口

(PHP 5 >= 5.1.0,PHP 7,PHP 8)

简介

SplObserver 接口与 SplSubject 一起使用以实现观察者设计模式。

接口概要

interface SplObserver {
/* 方法 */
public update(SplSubject $subject): void
}

目录

添加注释

用户贡献的注释 2 个注释

aiddroid at example dot com
11 年前
<?php

/**
* 主题,发布新闻的人
*/
class Newspaper implements \SplSubject{
private
$name;
private
$observers = array();
private
$content;

public function
__construct($name) {
$this->name = $name;
}

//添加观察者
public function attach(\SplObserver $observer) {
$this->observers[] = $observer;
}

//移除观察者
public function detach(\SplObserver $observer) {

$key = array_search($observer,$this->observers, true);
if(
$key){
unset(
$this->observers[$key]);
}
}

//发布突发新闻
public function breakOutNews($content) {
$this->content = $content;
$this->notify();
}

public function
getContent() {
return
$this->content." ({$this->name})";
}

//通知观察者(或其中一些)
public function notify() {
foreach (
$this->observers as $value) {
$value->update($this);
}
}
}

/**
* 观察者,接收新闻的人
*/
class Reader implements SplObserver{
private
$name;

public function
__construct($name) {
$this->name = $name;
}

public function
update(\SplSubject $subject) {
echo
$this->name.' 正在阅读突发新闻 <b>'.$subject->getContent().'</b><br>';
}
}

$newspaper = new Newspaper('纽约时报');

$allen = new Reader('艾伦');
$jim = new Reader('吉姆');
$linda = new Reader('琳达');

//添加读者
$newspaper->attach($allen);
$newspaper->attach($jim);
$newspaper->attach($linda);

//移除读者
$newspaper->detach($linda);

//发布突发新闻
$newspaper->breakOutNews('美国崩溃!');

//=====输出======
//艾伦 正在阅读突发新闻 美国崩溃! (纽约时报)
//吉姆 正在阅读突发新闻 美国崩溃! (纽约时报)
sebastien dot ferrandez at free dot fr
10 年前
注意,您写了

if($key){
unset($this->observers[$key]);
}

而它应该是

if(false !== $key){
unset($this->observers[$key]);
}

如果您要删除的观察者是数组中的第一个,则您将永远无法删除它,因为键将等于 0,并且 0 == false,如您所知。
To Top