redis - php两种封装类的优缺点?
php很多内置的类或扩展类比较粗糙,需要人为的封装一遍,于是有了两种封装方式,
1直接继承
2内部实例化
如redis类,
可以
<code>namespace lib class redis extends \Redis {} </code>
也可以
<code>namespace lib class redis { private $_redis = null; public function __construct() { $this->_redis = new \Redis() } } </code>
第一种方法的优点是方便,无须把所有的方法重写一遍,但是不太好统一捕捉异常,
第二种就是麻烦些,需要重写一遍所有的方法,(虽然可以用魔术方法),捕捉异常方便些。
大家用的哪种?为什么呢?
回复内容:
php很多内置的类或扩展类比较粗糙,需要人为的封装一遍,于是有了两种封装方式,
1直接继承
2内部实例化
如redis类,
可以
<code>namespace lib class redis extends \Redis {} </code>
也可以
<code>namespace lib class redis { private $_redis = null; public function __construct() { $this->_redis = new \Redis() } } </code>
第一种方法的优点是方便,无须把所有的方法重写一遍,但是不太好统一捕捉异常,
第二种就是麻烦些,需要重写一遍所有的方法,(虽然可以用魔术方法),捕捉异常方便些。
大家用的哪种?为什么呢?
继承
继承的特点有
- ✔实现成本低
- ✔调用者可以沿用原有的接口使用,学习成本低
- ✔原有的功能无需任何代码如常工作
-
✘无法隐藏或改变原有的功能
- 其实你可以这么做,就好像你确实可以用铁丝去捅插座眼一样
- 改变输入、改变输出、改变行为都属于改变功能,比如原来抛的异常现在不抛了,原来return false现在变异常了,原来输入的是青椒现在变牛肉了等等
✘正交性弱,没有做到屏蔽父类的依赖,需要更换父类的时候显得脆弱
常见的合适的应用有
- 增加日志记录等不影响原有逻辑的“旁路逻辑”
-
增加一些方法,比如原有的某一些方法a()b()c()总是连续一起调用,增加一个doABC()方法
- 仅限简单的少量的方法,如果要加复杂的功能或者大量的方法,还是建议用组合
增加一些静态/工厂方法,比如
new Redis(ip, port)
=>OurRedis::getInstance()
一句话说就是原有行为不变,is-a的场景用继承。
组合
组合的特点有
- ✘实现成本略高,创建对象的过程可能会变复杂
- ✘调用者需要理解新的接口
- ✘需要转发才能让原有的功能工作
- ✔很容易隐藏/屏蔽原有的部分功能
- ✔正交性强,可以通过更换内部的对象适配不同的情况而保持外部接口不变
常见的合适的应用有
- 一切涉及改变行为的需求
- 未来依赖会变的场景,比如redis会变成memcache,或者mysql会变mariadb之类
- 需要屏蔽细节的场景,比如Session Cache等需求确实用到redis,但对外肯定要屏蔽“这是个redis实现的session”。否则恐龙会出现在你背后把你脑袋咬掉
一句话就是某个功能依赖另一个功能,use-a或has-a的场景用组合
偏题,predis用起来还不错,可以一试
如果你看过任何一本设计模式的书,肯定都是推荐你使用第二种。
它们奉行的原则是:组合优于继承。
不过,还得看自己需求。如果系统的接口和你的类提供的一致,可以试试第一种。如果不一致,选择第二种。
如果你正在为系统设计 DB 中间层,需要适配不同的数据库,选择第二种。
楼主你干脆用Java吧,别用PHP了。用好一门语言就要掌握这门语言的特性和风格,按照这门语言的风格去行事。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Redis集群模式通过分片将Redis实例部署到多个服务器,提高可扩展性和可用性。搭建步骤如下:创建奇数个Redis实例,端口不同;创建3个sentinel实例,监控Redis实例并进行故障转移;配置sentinel配置文件,添加监控Redis实例信息和故障转移设置;配置Redis实例配置文件,启用集群模式并指定集群信息文件路径;创建nodes.conf文件,包含各Redis实例的信息;启动集群,执行create命令创建集群并指定副本数量;登录集群执行CLUSTER INFO命令验证集群状态;使

PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。

PHP不是在消亡,而是在不断适应和进化。1)PHP从1994年起经历多次版本迭代,适应新技术趋势。2)目前广泛应用于电子商务、内容管理系统等领域。3)PHP8引入JIT编译器等功能,提升性能和现代化。4)使用OPcache和遵循PSR-12标准可优化性能和代码质量。

PHP和Python各有优势,选择应基于项目需求。1.PHP适合web开发,语法简单,执行效率高。2.Python适用于数据科学和机器学习,语法简洁,库丰富。

Redis 使用哈希表存储数据,支持字符串、列表、哈希表、集合和有序集合等数据结构。Redis 通过快照 (RDB) 和追加只写 (AOF) 机制持久化数据。Redis 使用主从复制来提高数据可用性。Redis 使用单线程事件循环处理连接和命令,保证数据原子性和一致性。Redis 为键设置过期时间,并使用 lazy 删除机制删除过期键。

H5开发需要掌握的工具和框架包括Vue.js、React和Webpack。1.Vue.js适用于构建用户界面,支持组件化开发。2.React通过虚拟DOM优化页面渲染,适合复杂应用。3.Webpack用于模块打包,优化资源加载。

要查看 Redis 版本号,可以使用以下三种方法:(1) 输入 INFO 命令,(2) 使用 --version 选项启动服务器,(3) 查看配置文件。

解决redis-server找不到问题的步骤:检查安装,确保已正确安装Redis;设置环境变量REDIS_HOST和REDIS_PORT;启动Redis服务器redis-server;检查服务器是否运行redis-cli ping。
