2012-07-12 80 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容器。也許想想爲他們分離容器?