当需要监听某个对象的属性变化的时候,可以在被监听类里添加方法,所有对待监听属性的修改都需要经过该方法,经过该方法的时候都会通知所有观察类(这些观察类都需要注册到被监听的类里面去),然后观察类根据消息做出反应。
php实现
使用__set魔术方法是方便对所有属性的修改进行统一监听。
class BeObserved { // 被监听的类
private $val1;
private $val2;
private $_observers = [];
public function __set ($name, $value) {
// 判断属性是否存在
// array_key_exists($name,
// get_class_vars(get_class($this))
// )
$this->$name = $value;
foreach($this->_observers as $val) {
$val->update($name, $value);
}
}
public function __get ($name) {
return $this->$name;
}
public function register($observer) {
$this->_observers[] = $observer;
}
}
interface Observer {
public function update ($name, $value);
}
class ObserverA implements Observer{
public function update($name, $value) {
echo "the value $name has been changed to $value";
}
}
$change_cla = new BeObserved;
$change_cla->register(new ObserverA);
$change_cla->val1 = 1;