attach.php,PHP设计模式-观察者模式

本文介绍了如何通过PHP的观察者模式来处理用户登录时的多任务需求,如记录session、登录次数和在线时长等。通过将这些操作分解为独立的观察者,可以保持登录功能的单一职责,符合开闭原则。然而,需要注意的是,多个插件可能导致功能重叠,需要良好的文档和管理来避免数据错误。示例中展示了如何创建主题类(被观察者)和两个观察者类,并进行了实例调用。
摘要由CSDN通过智能技术生成

观察者模式

问题引入

一个系统在用户登录的时候,经常要记录一些东西:session、登录次数、统计在线时长等;如果这么多的操作按照面向过程的方法编写,使一个对象变得复杂,它要操作这么多的事情,这样也违反单一功能原则。

如果这些操作以插件形式加载或移除,那么登录只完成它的单一功能操作。这样就可以使用观察者模式,后期再增加相关功能模块,不需要太多工作就可以加载同步;也不用修改登录的功能(符合开闭原则);

缺点就是因为各个插件模块分散,后面功能可能重叠之前的功能,导致数据错误,所以在使用时要尽量注释或者整理好文档

使用场景当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。

当对一个对象的改变需要同时改变其它对象,而不知道具体有多少个对象待改变。

当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换句话说,你不希望这些对象是紧密耦合的

如何使用

php已经提供了主题接口类和观察者接口类,还有一个SplObjectStorage数据结构对象容器——实现了Countable,Iterator,Serializable,ArrayAccess四个接口。可实现统计、迭代、序列化、数组式访问等功能。主题类(被观察者)namespace Observer;use SplObjectStorage;use SplObserver;use SplSubject;class User implements SplSubject{    /**

* @var SplObjectStorage

*/

private $observers;    public function __construct()

{        $this->observers = new SplObjectStorage();

}    /**

* Attach an SplObserver

* @link http://php.net/manual/en/splsubject.attach.php

* @param SplObserver $observer 

* The SplObserver to attach.

* @return void

* @since 5.1.0

*/

public function attach(SplObserver $observer)

{        $this->observers->attach($observer);

}    /**

* Detach an observer

* @link http://php.net/manual/en/splsubject.detach.php

* @param SplObserver $observer 

* The SplObserver to detach.

* @return void

* @since 5.1.0

*/

public function detach(SplObserver $observer)

{        $this->observers->detach($observer);

}    /**

* Notify an observer

* @link http://php.net/manual/en/splsubject.notify.php

* @return void

* @since 5.1.0

*/

public function notify()

{        foreach ($this->observers as $observer) {

$observer->update($this);

}

}

}观察者1namespace Observer;use SplObserver;use SplSubject;class UserObserver implements SplObserver{    /**

* Receive update from subject

* @link http://php.net/manual/en/splobserver.update.php

* @param SplSubject $subject 

* The SplSubject notifying the observer of an update.

* @return string

* @since 5.1.0

*/

public function update(SplSubject $subject)

{        echo '我是观察者1:获取用户信息' . '
';

}

}观察者2namespace Observer;use SplSubject;class OntimeObserver implements \SplObserver{    /**

* Receive update from subject

* @link http://php.net/manual/en/splobserver.update.php

* @param SplSubject $subject 

* The SplSubject notifying the observer of an update.

* @return string

* @since 5.1.0

*/

public function update(SplSubject $subject)

{        echo '我是观察者2:记录用户在线时间' .'
';

}

}实施调用use Observer\OntimeObserver;use Observer\User;use Observer\UserObserver;

spl_autoload_register(function($class_name) {

$class_file = realpath(dirname(__FILE__)."/../") .'/' . str_replace('\\','/', $class_name) . '.php';    if (file_exists($class_file)) {        include $class_file;

} else {        echo "加载文件失败";

}

});//实例化主题类$user = new User();//添加观察者$user->attach(new UserObserver());

$user->attach(new OntimeObserver());//通知观察者$user->notify();

作者:PHP的艺术编程

链接:https://www.jianshu.com/p/09cddd2aaad4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值