看到好多面試都問設計模式,我就簡單的瞭解了一下,順便把以前封裝好的Reis作了一次修改.面試
單例模式(Singleton Pattern 單件模式或單元素模式)redis
單例模式確保某個類只有一個實例,並且自行實例化並向整個系統提供這個實例。數據庫
單例模式有如下3個特色:json
1 . 它必須有一個構造函數,並且構造函數必須爲私有設計模式
2.必須有一個保存實例的靜態成員變量函數
3.擁有一個訪問這個實例的公共的靜態方法測試
爲何使用單例模式?spa
PHP一個主要應用場合就是應用程序與數據庫打交道的場景,在一個應用中會存在大量的數據庫操做,針對數據庫句柄鏈接數據庫的行爲,使用單例模式能夠避免大量的new操做。由於每一次new操做都會消耗系統和內存的資源。設計
單例模式下面上代碼:code
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'));