Bellow是一个PHP脚本。
我试图实现Observer模式(没有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 :(得分:1)
您的User
课程没有实施interface IObserver
,因此不会强制使用方法update()
。
您必须实例化new User()
才能将其添加到UsersLibrary
:
$library = new UsersLibrary();
$user = new User(1, "Demo");
$library->add($user);
此外,您正在将用户和记录器混合到UsersLibrary容器中。也许考虑为他们分离容器?
答案 1 :(得分:0)
您正在$a->add()
来电中传递字符串而不是对象。您应该传入一个对象,或者更改UserLibrary :: add()中的代码以将其参数包装在适当的对象中(或者对它进行对象查找会看到一个字符串,例如找到具有该名称的用户)。 / p>
$user = new User(1, "Demo");
$a = new UsersLibrary();
$a->add($user);