gpt4 book ai didi

php - SplSubject/SplObserver有何用处?

转载 作者:IT王子 更新时间:2023-10-28 23:54:59 26 4
gpt4 key购买 nike

Standard PHP Library通过 SplSubject SplObserver 类包括一些资源称为Observer模式的引用实现。对于我自己的一生,我无法弄清楚这些方法如何非常有用,无法将实际事件或任何其他信息与通知一起传递:

class MySubject implements SplSubject {
protected $_observers = [];

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

public function detach(SplObserver $observer) {
$id = spl_object_hash($observer);

if (isset($this->_observers[$id])) {
unset($this->_observers[$id]);
}
}

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

class MyObserver implements SplObserver {
public function update(SplSubject $subject) {
// something happened with $subject, but what
// was it???
}
}

$subject = new MySubject();
$observer = new MyObserver();

$subject->attach($observer);
$subject->notify();

这些接口(interface)似乎对于任何现实世界的问题都几乎没有用。有人可以启发我吗?

编辑:

这是我界面的最大问题(尽管还有其他问题):
public function update(SplSubject $subject, Event $event) { /* ... */ }

...得到以下致命错误:
PHP Fatal error:  Declaration of MyObserver::update() must be compatible with SplObserver::update(SplSubject $SplSubject)

编辑#2:

通过为其他参数提供默认值来使其成为可选参数,可以防止致命错误,并提供一种传递上下文的方法,使实现值得。我以前没有意识到这一点,所以这几乎可以回答我的问题。解决方案是传递您自己的事件/消息数据,并在 SplObserver::update()中检查其是否存在。

最佳答案

您可以使用可选参数实现update方法,并且仍然满足SplSubject接口(interface)。

class MyObserver implements SplObserver {
public function update(SplSubject $subject, $eventData = null) {
if (is_null($eventData))
// carefull
}
}

关于php - SplSubject/SplObserver有何用处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13774149/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com