时间:2021-07-01 10:21:17 帮助过:16人阅读
如redis类,
可以
namespace lib
class redis extends \Redis {}
也可以
namespace lib
class redis {
private $_redis = null;
public function __construct() {
$this->_redis = new \Redis()
}
}
第一种方法的优点是方便,无须把所有的方法重写一遍,但是不太好统一捕捉异常,
第二种就是麻烦些,需要重写一遍所有的方法,(虽然可以用魔术方法),捕捉异常方便些。
大家用的哪种?为什么呢?
php很多内置的类或扩展类比较粗糙,需要人为的封装一遍,于是有了两种封装方式,
1直接继承
2内部实例化
如redis类,
可以
namespace lib
class redis extends \Redis {}
也可以
namespace lib
class redis {
private $_redis = null;
public function __construct() {
$this->_redis = new \Redis()
}
}
第一种方法的优点是方便,无须把所有的方法重写一遍,但是不太好统一捕捉异常,
第二种就是麻烦些,需要重写一遍所有的方法,(虽然可以用魔术方法),捕捉异常方便些。
大家用的哪种?为什么呢?
继承的特点有
✘无法隐藏或改变原有的功能
✘正交性弱,没有做到屏蔽父类的依赖,需要更换父类的时候显得脆弱
常见的合适的应用有
增加一些方法,比如原有的某一些方法a()b()c()总是连续一起调用,增加一个doABC()方法
增加一些静态/工厂方法,比如new Redis(ip, port)
=> OurRedis::getInstance()
一句话说就是原有行为不变,is-a的场景用继承。
组合的特点有
常见的合适的应用有
一句话就是某个功能依赖另一个功能,use-a或has-a的场景用组合
偏题,predis用起来还不错,可以一试
如果你看过任何一本设计模式的书,肯定都是推荐你使用第二种。
它们奉行的原则是:组合优于继承。
不过,还得看自己需求。如果系统的接口和你的类提供的一致,可以试试第一种。如果不一致,选择第二种。
如果你正在为系统设计 DB 中间层,需要适配不同的数据库,选择第二种。
楼主你干脆用Java吧,别用PHP了。用好一门语言就要掌握这门语言的特性和风格,按照这门语言的风格去行事。