jimjam88/observer

具有C#样式的事件参数的PHP观察者模式

dev-master 2015-09-14 08:36 UTC

This package is not auto-updated.

Last update: 2024-09-28 18:10:39 UTC


README

非常简单的PHP观察者模式,具有C#样式的事件参数。

用法

通过扩展 Observer\Subject\SubjectAbstract 或实现 Observer\Subject\SubjectInterface 来创建一个主题...

use Observer\Subject\SubjectAbstract;

class Subject extends SubjectAbstract
{

}

创建一个将被发布给观察者的事件。所有事件参数 必须 扩展 Observer\Event\EventArgs

use Observer\Event\CallbackEventArgs;

class Event extends CallbackEventArgs
{
    /**
     * Some event args info
     *
     * @var string
     */
    protected $info;

    /**
     * Gets the value of info.
     *
     * @return string
     */
    public function getInfo()
    {
        return $this->info;
    }

    /**
     * Sets the value of info.
     *
     * @param  string $info the info
     * @return self
     */
    public function setInfo($info)
    {
        $this->info = $info;

        return $this;
    }
}

现在创建一些观察者。观察者必须实现 Observer\Observer\ObserverInterface

use Observer\Observer\ObserverInterface;
use Observer\Event\EventArgs;

class ObserverA implements ObserverInterface
{
    public function notify(EventArgs $args)
    {
        var_dump(__CLASS__);

        var_dump($args->getInfo());

        call_user_func($args->getCallback());
    }
}

class ObserverB implements ObserverInterface
{
    public function notify(EventArgs $args)
    {
        var_dump(__CLASS__);

        var_dump($args->getInfo());

        call_user_func($args->getCallback());
    }
}

现在把它全部组合起来...

// Instantiate the subject
$subject = new Subject();

// ...and attach the observers
$subject->attach(new ObserverA());
$subject->attach(new ObserverB());

// Create an event
$event = new Event();
$event->setInfo('Hello, World!');
$event->setCallback(function() {
    var_dump('Hello, callback!');
});

// Notify the observers of the event
$subject->notify($event);

上面的代码将输出

string(9) "ObserverA"
string(13) "Hello, World!"
string(16) "Hello, callback!"
string(9) "ObserverB"
string(13) "Hello, World!"
string(16) "Hello, callback!"