gpt4 book ai didi

php - PHP中的观察者模式——不同事件的正确做法

转载 作者:可可西里 更新时间:2023-10-31 23:31:03 25 4
gpt4 key购买 nike

我想知道我是否为不同的事件实现了观察者模式,例如'userLoggedOut'、'userRegistered'、'userLoggedIn' 是正确的,下面是我的简化代码:

index.php

$login = new \Observer\Observable\Login;
$userData = $login->getData();

$login->attach( new \Observer\Observer\Email );

$login->notify( 'userLoggedIn' );
$login->notify( 'userLoggedOut', $userData );
$login->notify( 'userRegistered' );

登录.php

namespace Observer\Observable;
use Observer\Interfaces;

class Login implements Interfaces\Observable {

private $observers = array();

function attach( Interfaces\Observer $object ) {

$this->observers[] = $object;

}

function getObservers() {

return $this->observers;

}

function notify( $action, $data = null ) {

foreach( $this->observers as $observer ) :

if( method_exists( $observer, $action ) ) $observer->$action( $data );

endforeach;

}

}

Email.php

namespace Observer\Observer;
use Observer\Interfaces;

class Email implements Interfaces\Observer {

function userLoggedIn( $data = null ) {

echo "email user logged in";

}

function userLoggedOut( $data = null ) {

echo "email user logged out";

}

function userRegistered( $data = null ) {

echo "email user registered";

}

}

我的问题是在处理多个操作时是否有更好的方法来实现观察者模式。

最佳答案

我不认为你的实现是错误的,但它只是不适合我。你的 Observable 必须知道事件处理函数并实现它们(没有某种接口(interface)来保证它们在那里。为了继续你的方式,我会确保任何东西都将附加到 Login 应该实现一个接口(interface),保证那些操作函数在那里。从那里,Login 不必了解任何关于观察者的信息,它只需调用函数。

我会采用的另一种方法是指定事件名称的处理程序,如下所示:

class Observable {
protected static $event_names = array();
protected $observers = array();

function __construct() {
foreach (static::$event_names as $event_name) {
$this->observers[$event_name] = array();
}
}

function register($event, $object, $handler) {
if (array_key_exists($event, $this->observers)) {
$this->observers[$event][] = array($object, $handler);
} else {
echo "Invalid event \"$event\"!";
}
}

function trigger($event, $data = null) {
foreach ($this->observers[$event] as $observer) {
$observer[0]->$observer[1]($data);
}
}
}

class Login extends Observable {
protected static $event_names = array("userLoggedIn", "userLoggedOut", "userRegistered");
}

然后你是观察者会像这样注册事件:

class SomeListener {
function __construct() {
$login_instance->register("userLoggedIn", $this, "myLoggedInHandler");
}

function myLoggedInHandler($data = null) {
echo "User Logged In.";
}
}

虽然这只是一个意见,它是一种不同的方法,但它只需要知道触发了什么事件(你的方法也可以争论,但 Observable 应该简单地调用处理程序方法 IMO)。

关于php - PHP中的观察者模式——不同事件的正确做法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23114087/

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