2012-07-12 78 views
0

Bellow是一个PHP脚本。PHP观察者模式,问题

我试图实现观察者模式(没有MVC结构)...只有基本。

遇到的错误已在注释中指定。 首先,我尝试将User对象添加到UsersLibrary存储库。有一个错误,如User :: update()不存在或某事。

为什么遇到该错误?应该应用什么修补程序?

interface IObserver { 
     public function update(IObservable $sender); 
    } 
    interface IObservable { 
     public function addObserver(IObserver $obj); 
     public function notify(); 
    } 
    class UsersLibrary implements IObservable { 
     private $container; 
     private $contor; 
    //private $z; 
    public function __construct() {//IObserver $a) { 
     $this->container = array(); 
     $this->contor = 0; 
     echo "<div>[constructing UsersLibrary...]</div>"; 
     $this->addObserver(new Logger()); 
     //$this->z = $a; 
    } 
    public function add($obj) { 
     echo "<div>[adding a new user...]</div>"; 
     $this->container[$this->contor] = $obj; 
     $this->contor++; 
     $this->notify(); 
    } 
    public function get($index) { 
     return $this->container[$index]; 
    } 
    public function addObserver(IObserver $obj) { 
     $this->container[] = $obj; 
    } 
    public function notify() { 
     echo "<div>[notification in progress...]</div>"; 
     foreach($this->container as $temp) { 
      //echo $temp; 
      ################################################################# 
      $temp->update(); //--------ERROR 
     //Fatal Error: Call to a member function update() on a non-object. 
      ################################################################# 
     } 
     //$this->container[0]->update(); 
     //$this->z->update($this); 
    } 
} 
class User { 
    private $id; 
    private $name; 
    public function __construct($id, $name) { 
     $this->id = $id; 
     $this->name = $name; 
    } 
    public function getId() { 
     return $this->id; 
    } 
    public function getName() { 
     return $this->name; 
    } 
} 
class Logger implements IObserver { 
    public function __construct() { 
     echo "<div>[constructing Logger...]</div>"; 
    } 
    public function update(IObservable $sender) { 
     echo "<div>A new user has been added.</div>"; 
    } 
} 
$a = new UsersLibrary(); //new Logger()); 
//$a->add(new User(1, "DemoUser1")); 
//$a->add(new User(2, "DemoUser2")); 
$a->add("Demo"); 
echo $a->get(0); 
//echo $a->get(0)->getName(); 

回答

0

您在您的通话$a->add()传递一个对象的字符串代替。你应该传递一个对象,或者修改UserLibrary :: add()中的代码,将它的参数包含在一个合适的对象中(或者查看它的对象查看一个字符串,例如找到一个具有该名称的用户)。

$user = new User(1, "Demo"); 
$a = new UsersLibrary(); 
$a->add($user); 
1

User类没有实现interface IObserver,因此不强迫有方法update()

你必须实例化一个new User(),以便将它添加到UsersLibrary

$library = new UsersLibrary(); 
$user = new User(1, "Demo"); 
$library->add($user); 

而且,你混合用户记录仪到您的UsersLibrary容器。也许想想为他们分离容器?