您好,登錄后才能下訂單哦!
怎么在PHP中利用單例模式實現一個數據庫連接類?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
單例模式的數據庫連接類
db.php
<?php //單例模式的數據庫連接 class DB { //存儲實例的靜態成員變量 static public $_instance; //數據庫連接靜態變量 static public $_connectSource; //連接數據庫配置,由于前幾天學習了PDO,這里就使用PDO private $_dbConfig = array( 'host' => 'localhost', 'user' = > 'root', 'password' => '', 'database' => 'test' ); //禁止外部實例化 private function __construct() { } //實例化 public static function getInstance() { if(self::$_instance instanceof self) { return self::$_instance; } self::$_instance = new self(); return self::$_instance; } //數據庫連接 public function connect() { //如果不存在數據庫連接就創建一個 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實現頁面靜態化的例子
其實原理很簡單,這里用到了幾個函數,ob_start()
,ob_get_contents()
,file_put_contents()
,ob_start()
是開啟緩沖區的意思,ob_get_contents()
是得到緩沖區內容的意思,file_put_contents()
是把內容放到一個文件里的意思,如果不理解緩沖區的意思,可以自行百度一下,我理解的緩沖區就是,當我們要在PHP中輸出一些數據顯示出來時,會先經過緩沖區,而我們可以從緩沖區中得到這些內容。所以實現純靜態頁面的方法就是,獲取緩沖區中的內容放到一個靜態文件中,并在入口中根據需求設置訪問動態文件還是靜態文件,這種方法一般用于數據不經常變化的動態頁面中。下面就來具體的實現這個功能。
static.php
<?php //1.使用剛才寫的數據庫連接類連接數據庫 //2.把獲取到的數據填充到模板文件中 //3.把頁面轉化為靜態文件 //如果我們本地有這個靜態文件并且這個文件生成的時間小于5分鐘那么就去訪問這個靜態文件,filemtime()用來獲取文件的最后修改時間 if(is_file('./static.shtml') && (time() - filemtime('./static.shtml')) < 300) { //這里很簡單,直接把靜態文件拿過來 require_once('./static.shtml'); }else { //如果不存在這個靜態文件,或者這個靜態文件的最后修改時間距離現在已經超過了5分鐘,那么就訪問動態獲取數據的模板,然后更新static.shtml文件的內容 //連接數據庫 header('Content-Type:text/html;charset=utf-8'); require_once('./db.php'); $connect = DB::getInstance()->connect(); //執行查詢操作 $sql = 'select * from account'; $res = $connect->query($sql); //開啟緩沖區 ob_start(); //ob_get_clean()這個函數可以獲取緩沖區的內容并清空,一會我會測試一下ob_get_clean()和ob_get_contents()的 require_once('./static_show.php'); //把緩沖區的內容寫入到靜態文件 file_put_contents('./static.shtml', ob_get_contents()); } ?>
動態展示模板文件static_show.php
<?php foreach($res as $row) { echo '名字:'.$row['name'].'<br/>'; echo '錢包:'.$row['money'].'<br/>'; echo '<hr/>'; } ?>
當我們訪問static.php的時候,因為沒有static.shtml,所以會先執行else的操作,展示在static_show.php并生成static.shtml文件
如果這時候我把數據庫修改了,zjp的money改為800,然后再訪問static.php會展示什么樣的內容呢,沒錯,zjp的錢包還是600,為什么呢,因為它執行了if中的內容,直接顯示了static.shtml,我們可以看一下static.shtml是什么樣的:
如果5分鐘過后再訪問staitc.php呢,會顯示什么呢,沒錯!zjp的錢包就變成800了,并且static.shtml的內容會更新為zjp的錢包是800。
測試ob_get_clean()和ob_get_contents()
測試方法很簡單:
<?php $test = 'Hello World!'; //開啟緩沖區 ob_start(); //測試ob_get_contents() echo $test; echo ob_get_contents(); //輸出結果:Hello World!Hello World! //測試ob_get_clean() echo $test; echo ob_get_clean(); //輸出結果:Hello World! echo $test; ob_get_clean(); //輸出結果: ?>
這樣就可以很清楚的看出來了,當我們使用了ob_get_clean()
的時候,輸出語句并不會輸出任何值,因為ob_get_clean()
會獲取緩沖區中的內容并將緩沖區清空。所以當我們echo test
的時候并沒有得到test的時候并沒有得到test的值,echo ob_get_clean()
的時候卻能夠獲取到值。而當我們使用ob_get_contents()
的時候緩沖區中的內容并沒有被清空。
實際上,ob_get_clean()
函數相當于執行了,ob_get_contents()
和ob_end_clean()
。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。