今天在學習php面向對象時,看到一個面向對象的面試題php
題目是這樣的:mysql
+++++++面試題++++++++++面試
請用 PHP5 代碼編寫類實如今每次對數據庫鏈接的訪問中都只能得到惟一的一個數據庫鏈接,具體鏈接數據庫的詳細代碼忽略,請寫出主要邏輯代碼sql
+++++++++++++++++++數據庫
單例模式有幾個要點:django
1.類的構造函數必須標記爲 private(私有) (訪問控制:防止外部代碼通地new 操做符建立對象) 來能在其它類中實例化,只能在類自身中進行實例化。設計模式
private fcuntion __construc()函數
2.擁用一個保存類實例的 私有靜態成員變量學習
private static $ins ; //$ins 用來保存這個類的實例spa
3.擁有一個訪問這個類實例的靜態方法(經常使用getInstance()方法進行實例化單例類,經過instanceof操做符能夠檢測到類是否已經被實例化)
4.建立 私有的__clone 方法 ,防止對象被複制。
爲何這麼作呢?
一、php的應用主要在於數據庫應用, 因此一個應用中會存在大量的數據庫操做, 使用單例模式, 則能夠避免大量的new 操做消耗的資源。
二、若是系統中須要有一個類來全局控制某些配置信息, 那麼使用單例模式能夠很方便的實現. 這個能夠參看ZF的FrontController部分。
三、在一次頁面請求中, 便於進行調試, 由於全部的代碼(例如數據庫操做類db)都集中在一個類中, 咱們能夠在類中設置鉤子, 輸出日誌,從而避免處處var_dump, echo。
最終答案代碼以下
<?php class Mysql { private static $instance = null; private $conn; // 構造方法,設置爲private,不容許經過new得到對象實例 private function __construct(argument) { $conn = mysql_connect("localhost","root","root"); } // 獲取實例方法 public static function getInstance() { if (!self::$instance instanceof self) { self::$instance = new self; } return self::$instance; } // 禁止克隆 private function __clone(){} } // 得到對象 $db = Mysql::getInstance(); ?>
再此作一下備忘錄。
class Mysql { privatestatic $instance = null; private $conn; // 構造方法,設置爲private,不容許經過new得到對象實例privatefunction __construct(argument) { $conn = mysql_connect("localhost","root","root"); } // 獲取實例方法publicfunction getInstance() { if (!self::$instance instanceofself) { self::$instance = newself; } returnself::$instance; } // 禁止克隆privatefunction __clone(){} } // 得到對象 $db = Mysql::getInstance();