標籤:開始 方便 detail offset 串連數 isset lin 編程 操作方法
概況
如何讓編程變得更簡單?
這裡,我們嘗試用“設計模式”,去解決一些複雜的邏輯問題。為了便於理解,我們先從“封裝”開始逐漸引入設計模式;也為了便於理解 ,我們通篇採用一個電影網站來作為需求的背景。
封裝
我們的電影網站,首先有一個電影列表頁。它從資料庫抓取多條電影資料,並通過html展示出來,代碼大致如下:
<?php
// List.php
$offset = isset($_GET[‘offset‘]) ? $_GET[‘offset‘] : 0;
$length = isset($_GET[‘length‘]) ? $_GET[‘length‘] : 8;
$pdo = new PDO(‘mysql:host=localhost;dbname=movie‘, ‘root‘, ‘‘);
$sql = ‘select * from movie limit :offset,:length‘;
$pdoStatement = $pdo->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$pdoStatement->execute(array(‘:offset‘ => $offset, ‘:length‘ => $length))
$data = $pdoStatement->fetchAll(PDO::FETCH_ASSOC);
$html = ‘‘;
foreach ($data as $record) {
$html .= sprintf(‘<li><a href="detail.php?id=%s">%s</a></li>‘,$record[‘movieId‘], $record[‘name‘]);
}
echo sprintf(‘<ul>%s</ul>‘, $html);
這裡,我們採用pdo方式去查詢資料庫,然後迴圈輸出html來顯示電影列表。很顯然,實際項目中,資料庫的查詢要不斷的被重複使用,如果都像這麼源碼重複編寫的的話,項目將變得麻煩而又難以維護。於是,我們嘗試著“把重複的部分封裝起來”,當然,可以用函數,這是一種比較簡單的封裝手法;也可以用類,這種封裝手法能給我們提供更多的特性。這裡,我們採用類,代碼如下:
<?php
// Connection.php
class Connection
{
private $connection = ‘‘;
public function __construct()
{
$this->connection = new PDO(‘mysql:host=localhost;dbname=test‘, ‘root‘, ‘‘);
}
// 擷取多行資料
public function getAll($sql)
{
return $connection->query($sql)->fetchAll(PDO::FETCH_ASSOC);
}
... // 更多的資料操作方法
}
封裝後,列表頁的代碼簡化為:
<?php
// List.php
require ‘Connection.php‘;
$offset = isset($_GET[‘offset‘]) ? $_GET[‘offset‘] : 0;
$length = isset($_GET[‘length‘]) ? $_GET[‘length‘] : 8;
$db = new Connection();
$data = $db->getList(‘select * from movie limit :offset,:length‘, array($offset, $length));
$html = ‘‘;
foreach ($data as $record) {
$html .= sprintf(‘<li><a href="detail.php?id=%s">%s</a></li>‘,$record[‘movieId‘], $record[‘name‘]);
}
echo sprintf(‘<ul>%s</ul>‘, $html);
很明顯,列表頁的代碼變得簡潔,也更容易理解了。
我們通過程式設計語言提供的封裝手法,提取出了代碼中的重複部分。這樣,能讓我們少寫很多代碼,而且還能讓調用者的代碼變得更加簡潔。就“如何讓編程變得更簡單”而言,”把代碼封裝起來“便成了一個很不錯的思路。
而封裝本身還給我們帶來另外一個好處,那就是封裝了變化。
我們假設現在需要加入一種重試機制,多次嘗試串連資料庫,以防資料庫不穩定帶來的串連失敗。在現有封裝好的代碼裡,我們只需要修改資料庫連接的局部代碼,而List.php裡面對Connection的調用代碼,我們就基本不需要關心。由於封裝的緣故,這種改變對於List.php是不可見的。具體實現如下:
class Connection
{
private $connection = ‘‘;
public function __construct()
{
$count = 0;
$connection = false;
while(empty($connection) && $count < 3) {
$connection = new PDO(‘mysql:host=localhost;dbname=test‘, ‘root‘, ‘‘);
$count++;
}
$this->connection = $connection;
}
// 擷取多行資料
public function getAll($sql){...}
... // 更多的資料操作方法
}
封裝的這種特性,能讓我們在很小的範圍內,應對需求的最佳化和修改,很是方便。當然,有時候我們會發現封裝出來的東西,並不是那麼友好。這很大程度上取決於你封裝時抽象的角度,抽象和封裝,本身就是一件很見功夫的事情。不管怎樣,嘗試著去封裝一些東西吧,你很快會發現,這麼做是多麼的神奇和有趣。
php設計模式探秘(1)-封裝