如何在PHP登录系统中使用Observer模式?

如何在PHP登录系统中使用Observer模式?,php,class,design-patterns,observer-pattern,Php,Class,Design Patterns,Observer Pattern,我对设计模式是新手。我有一个登录系统,里面有一些类可以连接到我的数据库之类的东西 但是现在我想在PHP代码中包含一个观察者模式。但我不知道该怎么做。例如,每当有新用户时,我都会通知一个用户。我知道观察者模式是如何工作的,例如它做什么。但我不知道如何将其包含到PHP代码中。那个么,如何创建一个包含观察者模式的登录系统呢 例如,下面是我的数据库连接类: private $pdo; function __construct() { $this->pdo = new PDO('mysql

我对设计模式是新手。我有一个登录系统,里面有一些类可以连接到我的数据库之类的东西

但是现在我想在PHP代码中包含一个观察者模式。但我不知道该怎么做。例如,每当有新用户时,我都会通知一个用户。我知道观察者模式是如何工作的,例如它做什么。但我不知道如何将其包含到PHP代码中。那个么,如何创建一个包含观察者模式的登录系统呢

例如,下面是我的数据库连接类:

private $pdo;

function __construct() {
    $this->pdo = new PDO('mysql:host=localhost;dbname=users', '', '');
}
下面是我在登录文件中使用的代码:

if(isset($_POST['username']) && isset($_POST['password'])) {
    include_once("classes/database.php");
    $db = new DB();
    $result = $db->query("SELECT username, pass FROM users WHERE username='".$_POST['username']."' AND pass='".$_POST['password']."'");

    if(isset($result[0]['username']) && isset($result[0]['password'])) {
        $_SESSION['username'] = $_POST['username'];
        header("Location: start.php?username=".$_SESSION['username']);
    }

这是一个使用观察者模式将观察者注册到登录系统的示例。在本例中,我注册了一名观察员,在创建新用户时向管理员发送电子邮件:

首先,我们创建定义可观察者/观察者行为的接口

interface IObserver
{
     //an observer has to implement a function, that will be called when the observable changes
     //the function receive data (in this case the user name) and also the observable object (since the observer could be observing more than on system)
     function onUserAdded( $observable, $data );
}

interface IObservable
{
    //we can attach observers to the observable
    function attach( $observer );
}
然后让主登录系统实现IObservable,实现attach函数,并保留一组观察者。在内部,您实现了一个notify函数,在调用该函数时,迭代数组并通知每个观察者

您要做的是,在创建用户的所有正常行为之后,调用notify函数

class LoginSystem implements IObservable
{
    private $observers = array();

    private function notify( $userName )
    {
        foreach( $this->observers as $o )
            $o->onUserAdded( $this, $userName );
    }

    public function attach( $observer )
    {
        $this->observers []= $observer;
    }

    public function createUser( $userName )
    {

        //all your logic to add it to the databse or whatever, and then:

        $this->notify($userName);

    }

}
然后,创建一个类,然后实现Iobserver。在onUserAdded函数中,当观察到的事件发生时,您可以执行希望发生的任何操作。在本例中,我只是向硬编码的电子邮件发送一封邮件。它可以是你想要的那么复杂

class NewUserMailer implements IObserver
{
    public function  onUserAdded( $observable, $data ) 
    {
        mail("admin@yoursite.com", "new user", $data);
    }
}
然后,行为就是,在创建登录系统之后,您还创建了一个观察者,并将其附加到登录系统

$ls = new LoginSystem();
$ls->attach( new NewUserMailer() );

这样,每次创建新用户时,都会将邮件发送到“admin@yoursite.com“

您是否在developerWorks站点上看到了示例实现?