溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么在PHP中利用單例模式實(shí)現(xiàn)一個數(shù)據(jù)庫連接類

發(fā)布時間:2021-05-31 16:25:39 來源:億速云 閱讀:116 作者:Leah 欄目:開發(fā)技術(shù)

怎么在PHP中利用單例模式實(shí)現(xiàn)一個數(shù)據(jù)庫連接類?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

單例模式的數(shù)據(jù)庫連接類

db.php

<?php
//單例模式的數(shù)據(jù)庫連接
class DB {
  //存儲實(shí)例的靜態(tài)成員變量
  static public $_instance;
  //數(shù)據(jù)庫連接靜態(tài)變量
  static public $_connectSource;
  //連接數(shù)據(jù)庫配置,由于前幾天學(xué)習(xí)了PDO,這里就使用PDO
  private $_dbConfig = array(
    'host' => 'localhost',
    'user' = > 'root',
    'password' => '',
    'database' => 'test'
  );
  //禁止外部實(shí)例化
  private function __construct() {
  }
  //實(shí)例化
  public static function getInstance() {
    if(self::$_instance instanceof self) {
      return self::$_instance;
    }
    self::$_instance = new self();
    return self::$_instance;
  }
  //數(shù)據(jù)庫連接
  public function connect() {
    //如果不存在數(shù)據(jù)庫連接就創(chuàng)建一個
    if(!self::$_connectSource) {
      try {
        $dsn = 'mysql:host='.$this->_dbConfig['host'].';dbname='.$this->_dbConfig['database'];
        $username = $this->_dbConfig['user'];
        $password = $this->_dbConfig['password'];
        self::$_connectSource = new PDO($dsn, $username, $password);
      }catch(PDOException $e) {
        echo $e->getMessage();
      }
    }
    return self::$_connectSource;
  }
}
?>

PHP實(shí)現(xiàn)頁面靜態(tài)化的例子

其實(shí)原理很簡單,這里用到了幾個函數(shù),ob_start(),ob_get_contents()file_put_contents(),ob_start()是開啟緩沖區(qū)的意思,ob_get_contents()是得到緩沖區(qū)內(nèi)容的意思,file_put_contents()是把內(nèi)容放到一個文件里的意思,如果不理解緩沖區(qū)的意思,可以自行百度一下,我理解的緩沖區(qū)就是,當(dāng)我們要在PHP中輸出一些數(shù)據(jù)顯示出來時,會先經(jīng)過緩沖區(qū),而我們可以從緩沖區(qū)中得到這些內(nèi)容。所以實(shí)現(xiàn)純靜態(tài)頁面的方法就是,獲取緩沖區(qū)中的內(nèi)容放到一個靜態(tài)文件中,并在入口中根據(jù)需求設(shè)置訪問動態(tài)文件還是靜態(tài)文件,這種方法一般用于數(shù)據(jù)不經(jīng)常變化的動態(tài)頁面中。下面就來具體的實(shí)現(xiàn)這個功能。

static.php

<?php
//1.使用剛才寫的數(shù)據(jù)庫連接類連接數(shù)據(jù)庫
//2.把獲取到的數(shù)據(jù)填充到模板文件中
//3.把頁面轉(zhuǎn)化為靜態(tài)文件
//如果我們本地有這個靜態(tài)文件并且這個文件生成的時間小于5分鐘那么就去訪問這個靜態(tài)文件,filemtime()用來獲取文件的最后修改時間
if(is_file('./static.shtml') && (time() - filemtime('./static.shtml')) < 300) {
  //這里很簡單,直接把靜態(tài)文件拿過來
  require_once('./static.shtml');
}else {
//如果不存在這個靜態(tài)文件,或者這個靜態(tài)文件的最后修改時間距離現(xiàn)在已經(jīng)超過了5分鐘,那么就訪問動態(tài)獲取數(shù)據(jù)的模板,然后更新static.shtml文件的內(nèi)容
  //連接數(shù)據(jù)庫
  header('Content-Type:text/html;charset=utf-8');
  require_once('./db.php');
  $connect = DB::getInstance()->connect();
  //執(zhí)行查詢操作
  $sql = 'select * from account';
  $res = $connect->query($sql);
  //開啟緩沖區(qū)
  ob_start();
  //ob_get_clean()這個函數(shù)可以獲取緩沖區(qū)的內(nèi)容并清空,一會我會測試一下ob_get_clean()和ob_get_contents()的
  require_once('./static_show.php');
  //把緩沖區(qū)的內(nèi)容寫入到靜態(tài)文件
  file_put_contents('./static.shtml', ob_get_contents());
}
?>

動態(tài)展示模板文件static_show.php

<?php
  foreach($res as $row) {
    echo '名字:'.$row['name'].'<br/>';
    echo '錢包:'.$row['money'].'<br/>';
    echo '<hr/>';
  }
?>

當(dāng)我們訪問static.php的時候,因?yàn)闆]有static.shtml,所以會先執(zhí)行else的操作,展示在static_show.php并生成static.shtml文件

怎么在PHP中利用單例模式實(shí)現(xiàn)一個數(shù)據(jù)庫連接類

如果這時候我把數(shù)據(jù)庫修改了,zjp的money改為800,然后再訪問static.php會展示什么樣的內(nèi)容呢,沒錯,zjp的錢包還是600,為什么呢,因?yàn)樗鼒?zhí)行了if中的內(nèi)容,直接顯示了static.shtml,我們可以看一下static.shtml是什么樣的:

怎么在PHP中利用單例模式實(shí)現(xiàn)一個數(shù)據(jù)庫連接類

如果5分鐘過后再訪問staitc.php呢,會顯示什么呢,沒錯!zjp的錢包就變成800了,并且static.shtml的內(nèi)容會更新為zjp的錢包是800。

測試ob_get_clean()和ob_get_contents()

測試方法很簡單:

<?php
$test = 'Hello World!';
//開啟緩沖區(qū)
ob_start();
//測試ob_get_contents()
echo $test;
echo ob_get_contents();
//輸出結(jié)果:Hello World!Hello World!
//測試ob_get_clean()
echo $test;
echo ob_get_clean();
//輸出結(jié)果:Hello World!
echo $test;
ob_get_clean();
//輸出結(jié)果:
?>

這樣就可以很清楚的看出來了,當(dāng)我們使用了ob_get_clean()的時候,輸出語句并不會輸出任何值,因?yàn)?code>ob_get_clean()會獲取緩沖區(qū)中的內(nèi)容并將緩沖區(qū)清空。所以當(dāng)我們echo test的時候并沒有得到test的時候并沒有得到test的值,echo ob_get_clean()的時候卻能夠獲取到值。而當(dāng)我們使用ob_get_contents()的時候緩沖區(qū)中的內(nèi)容并沒有被清空。

實(shí)際上,ob_get_clean()函數(shù)相當(dāng)于執(zhí)行了,ob_get_contents()ob_end_clean()。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI