/** * 單例模式 * @author YangYang <1812271619@qq.com> * 能夠想成在一次http請求中只產生該類的一個對象(即只new classname一次) * 經典的例子是數據庫鏈接(redis,mongodb,memcache等) * 在一次http請求中咱們可能須要對數據庫作增刪改查多條sql操做 * 可是若是一次http請求中每執行一條sql咱們就mysql_connect(),很明顯會致使服務器資源的浪費 * 爲了節約資源,就能夠經過單例模式來實現一次http請求只作一次mysql_connect() * 即將mysql_connect()放在類方法的__construct中,並將__construct方法作成私有, * 這樣只能經過getInstance()方法來得到mysql_connect()的資源鏈接符 * getInstance()方法中判斷是否已經存在myql鏈接符,若是存在就直接返回該鏈接符 * 不然new classname()即調用了__construct方法執行了mysql_connect()獲得了資源鏈接符,並返回鏈接符 * 由於如今PHP已再也不建議直接使用mysql函數進行數據庫操做,而是建議經過PDO進行數據庫操做,因此這裏寫一個簡易PDO鏈接的單例模式 * 這裏只是講解單例原理,數據庫的防sql注入等問題不作考慮 * 準備工做 數據庫:test 數據表:user 字段:id name 記錄:1 CodeAnti * 最終運行結果: 數據表user中id=1這條記錄被刪除 */
class SinglePDO {
private static $_instance = null; private $_pdo; //私有,防止外部直接實例化new SinglePDO(...) private function __construct($dsn,$dbUser,$dbPassword) { try{ $this->_pdo = new PDO($dsn,$dbUser,$dbPassword); $this->_pdo->exec('set names utf8'); }catch(PDOException $e){ die("Error:{$e->getMessage()}"); } } //私有,防止克隆 private function __clone(){} //獲取鏈接實例 public static function getInstance($dsn,$dbUser,$dbPassword) { if(self::$_instance === null) self::$_instance = new self($dsn,$dbUser,$dbPassword); return self::$_instance; } //執行sql public function execSql($sql) { $result = $this->_pdo->exec($sql); return $result; } } $dsn = "mysql:host=localhost;dbname=test"; $dbUser = "root"; $dbPassword = ""; $sql = "delete from user where id = 1"; $pdo = SinglePDO::getInstance($dsn,$dbUser,$dbPassword); $result = $pdo->execSql($sql); //$pdo->execSql($sql)屢次調用,但仍然是同一個pdo對象 print_r($result);