Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我应该使用观察者模式吗?_Php_Design Patterns_Observer Pattern - Fatal编程技术网

Php 我应该使用观察者模式吗?

Php 我应该使用观察者模式吗?,php,design-patterns,observer-pattern,Php,Design Patterns,Observer Pattern,在我的情况下,我认为最适合使用,但我不确定最好的实现方式 假设我有两张桌子 User id name email ... 这两个类都是从ORM扩展而来的,父类有一个save()方法 我还有一个xml提要,它存储了user的一些列和order的一些列。当第一次访问提要时,它从数据库中提取所需的信息,生成一个xml提要,并将对象存储在memcached中。对提要的任何后续命中都会从memcached中提取 class User extends ORM implements SplS

在我的情况下,我认为最适合使用,但我不确定最好的实现方式

假设我有两张桌子

User
  id
  name
  email
  ...
这两个类都是从ORM扩展而来的,父类有一个save()方法

我还有一个xml提要,它存储了user的一些列和order的一些列。当第一次访问提要时,它从数据库中提取所需的信息,生成一个xml提要,并将对象存储在memcached中。对提要的任何后续命中都会从memcached中提取

class User extends ORM implements SplSubject
{
    private $observers = array();

    function __construct()
    {
        $this->attach(new XMLObserver);
        parent::__construct();
    }

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

    function detach(SplObserver $observer)
    {
        $id = spl_object_hash($observer);
        unset($this->observers[$id]);
    }

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

    function save()
    {
       if (in_array($this->changed, array('name')) {
         $this->notify();
       }
       parent::save();
    }
}

class XMLObserver implements SplObserver
{
    function update(SplSubject $subject)
    {
        // code here to update memcached key
    }
}
我想做的是,如果某些字段以用户或顺序更改,我想更新memcached键。由于我没有存储user中的所有字段,也没有存储order中的所有字段,所以我不希望它发生在任何save()调用中(而且,xml生成脚本有点数据库密集型)

通过阅读有关Observer模式的内容,我认为User/Order对象也将实现SplSubject,并在其构造函数中附加一个XMLObserver。我必须重写save()方法来通知任何附加的观察者。我只会在某些字段发生更改时调用notify。XMLObserver将更新memcached

class User extends ORM implements SplSubject
{
    private $observers = array();

    function __construct()
    {
        $this->attach(new XMLObserver);
        parent::__construct();
    }

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

    function detach(SplObserver $observer)
    {
        $id = spl_object_hash($observer);
        unset($this->observers[$id]);
    }

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

    function save()
    {
       if (in_array($this->changed, array('name')) {
         $this->notify();
       }
       parent::save();
    }
}

class XMLObserver implements SplObserver
{
    function update(SplSubject $subject)
    {
        // code here to update memcached key
    }
}
我不确定这对我来说是否最有意义。根据我到目前为止的情况,为什么我不根据这些字段是否发生了更改(类似于
XMLFeed::update($key)
)调用一个静态方法呢。我并没有真正看到使用观察者是如何有益的,但我可能走错了方向


根据我们的评论,也许你应该考虑编写一个函数来确定是否应该将更改传播到MyCask,(取决于被改变的字段),而不是使用观测者模式。 由于memcache将是您唯一的订阅者,需要始终订阅,所以我认为您不会从这种模式的好处中受益太多。发件人:

观察者模式允许您改变 独立于受试者和观察者。 您可以重用主题,而无需重用 他们的观察员,反之亦然。信息技术 允许您添加观察员,而无需 修改主题或其他 观察员


还有其他好处,但我认为在您的场景中,您不会从中受益太多。

我不确定是否完全理解您的问题,但memcache真的是您唯一的观察者,还是memcache中有多个观察者?是否存在此XML提要的各种实例,或者只有一个实例在其中的字段发生更改时始终需要更新?当前没有设置其他观察者,因此如果我实现了此功能,memcache将是我唯一的观察者。notify()调用中还有一个bug。我需要在save()之后调用notify(),但我无法访问$this->changed,因为它在save()之后会被清除。这个xml提要也只有一个实例需要更新,对于每个用户对象,只有一个观察者应该总是被通知并且总是被订阅,这个模式似乎没有多大价值。是的,我最初认为我应该使用Observer,因为当主题发生变化时memcached会被更新,但是如果不修改主题,我就不能这样做,那么我可能不应该使用它。谢谢你的帮助!
class User extends ORM implements SplSubject
{
    private $observers = array();

    function __construct()
    {
        $this->attach(new XMLObserver);
        parent::__construct();
    }

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

    function detach(SplObserver $observer)
    {
        $id = spl_object_hash($observer);
        unset($this->observers[$id]);
    }

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

    function save()
    {
       if (in_array($this->changed, array('name')) {
         $this->notify();
       }
       parent::save();
    }
}

class XMLObserver implements SplObserver
{
    function update(SplSubject $subject)
    {
        // code here to update memcached key
    }
}