首页 > 解决方案 > 我可以在 __construct() 中为 SplSubject 实现的类调用 notify() 方法吗?

问题描述

我写了一个实现的类SplSubject。当我从此类构造函数中调用 notify() 方法时,它不起作用。

// SplSubject
class A implement SqlSubject
{
   public function __construct()
   {
        $this->notify('Event', $data);
   }
}

// SqlObserver

class B implements SplObserver
{
    public function update(SplSubject $subject, $event = null, $data = null)
    {
        echo "Fired " . $event . ' event';
    }
}

// Usage

$a = new A;
$b = new B;

$a->attach($b);

但是通知没有用。如果我在另一种方法而不是构造函数中调用通知,它可以正常工作。我的问题是,有没有办法从主题类构造函数通知观察者类?

标签: phpobserver-patternobservers

解决方案


这是因为您的constructorfor$a运行之前$b已附加。你可以创建一个工厂:

public static function createA() {
    $a = new A;
    $b = new B;
    $a->attach($b);
    $a->notify('Event', $data);
    return $a;
}

或者,您可以在通知之前传递$bconstructorand it:attach

   public function __construct($b)
   {
        $this->attach($b);
        $this->notify('Event', $data);
   }

推荐阅读