看到好多面试都问设计模式,我就简单的了解了一下,顺便把之前封装好的Reis做了一次修改.
单例模式(Singleton Pattern 单件模式或单元素模式)
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
单例模式有以下3个特点:
1 . 它必须有一个构造函数,而且构造函数必须为私有
2.必须有一个保存实例的静态成员变量
3.拥有一个访问这个实例的公共的静态方法
为什么使用单例模式?
PHP一个主要应用场合就是应用程序与数据库打交道的场景,在一个应用中会存在大量的数据库操作,针对数据库句柄连接数据库的行为,使用单例模式可以避免大量的new操作。因为每一次new操作都会消耗系统和内存的资源。
单例模式下面上代码:
class Predis { private static $handler = null; private static $_instance = null; private static $options = [ 'host' => '127.0.0.1', 'port' => 6379, 'password' => '', 'db' => 0, 'timeout' => 0, 'expire' => 0, 'persistent' => false, 'prefix' => '', ]; /* * 私有构造函数 */ private function __construct($options = []) { if (!extension_loaded('redis')) { throw new \BadFunctionCallException('not support: redis'); //判断是否有扩展 } if (!empty($options)) { self::$options = array_merge(self::$options, $options); } $func = self::$options['persistent'] ? 'pconnect' : 'connect'; //长链接 self::$handler = new \Redis; self::$handler->$func(self::$options['host'], self::$options['port'], self::$options['timeout']); if ('' != self::$options['password']) { self::$handler->auth(self::$options['password']); } if (0 != self::$options['db']) { self::$handler->select(self::$options['db']); } } /** * @return Predis|null 对象 */ public static function getInstance() { if (!(self::$_instance instanceof self)){ self::$_instance = new self(); } return self::$_instance; } /* * 禁止外部克隆 */ final public function __clone() { trigger_error('Clone is not allow!',E_USER_ERROR); } public function set($key, $value, $time = 0 ) { if(!$key) { return ''; } if(is_array($value)) { $value = json_encode($value); } if(!$time) { return self::$handler->set($key, $value); } return self::$handler->setex($key, $time, $value); } public function get($key) { if(!$key) { return ''; } return self::$handler->get($key); } public function __call($name,$args) { return call_user_func_array([self::$handler,$name],$args); } } //测试 Predis::getInstance()->set('name','孙悟空'); echo Predis::getInstance()->get('name')."\n"; Predis::getInstance()->sadd('myset','贝吉塔'); print_r(Predis::getInstance()->sMembers('myset'));