php設計模式探秘(1)-封裝

來源:互聯網
上載者:User

標籤:開始   方便   detail   offset   串連數   isset   lin   編程   操作方法   

概況

如何讓編程變得更簡單?
這裡,我們嘗試用“設計模式”,去解決一些複雜的邏輯問題。為了便於理解,我們先從“封裝”開始逐漸引入設計模式;也為了便於理解 ,我們通篇採用一個電影網站來作為需求的背景。

封裝

我們的電影網站,首先有一個電影列表頁。它從資料庫抓取多條電影資料,並通過html展示出來,代碼大致如下:

  1. <?php
  2. // List.php
  3. $offset = isset($_GET[‘offset‘]) ? $_GET[‘offset‘] : 0;
  4. $length = isset($_GET[‘length‘]) ? $_GET[‘length‘] : 8;
  5. $pdo = new PDO(‘mysql:host=localhost;dbname=movie‘, ‘root‘, ‘‘);
  6. $sql = ‘select * from movie limit :offset,:length‘;
  7. $pdoStatement = $pdo->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
  8. $pdoStatement->execute(array(‘:offset‘ => $offset, ‘:length‘ => $length))
  9. $data = $pdoStatement->fetchAll(PDO::FETCH_ASSOC);
  10. $html = ‘‘;
  11. foreach ($data as $record) {
  12. $html .= sprintf(‘<li><a href="detail.php?id=%s">%s</a></li>‘,$record[‘movieId‘], $record[‘name‘]);
  13. }
  14. echo sprintf(‘<ul>%s</ul>‘, $html);

這裡,我們採用pdo方式去查詢資料庫,然後迴圈輸出html來顯示電影列表。很顯然,實際項目中,資料庫的查詢要不斷的被重複使用,如果都像這麼源碼重複編寫的的話,項目將變得麻煩而又難以維護。於是,我們嘗試著“把重複的部分封裝起來”,當然,可以用函數,這是一種比較簡單的封裝手法;也可以用類,這種封裝手法能給我們提供更多的特性。這裡,我們採用類,代碼如下:

  1. <?php
  2. // Connection.php
  3. class Connection
  4. {
  5. private $connection = ‘‘;
  6. public function __construct()
  7. {
  8. $this->connection = new PDO(‘mysql:host=localhost;dbname=test‘, ‘root‘, ‘‘);
  9. }
  10. // 擷取多行資料
  11. public function getAll($sql)
  12. {
  13. return $connection->query($sql)->fetchAll(PDO::FETCH_ASSOC);
  14. }
  15. ... // 更多的資料操作方法
  16. }

封裝後,列表頁的代碼簡化為:

  1. <?php
  2. // List.php
  3. require ‘Connection.php‘;
  4. $offset = isset($_GET[‘offset‘]) ? $_GET[‘offset‘] : 0;
  5. $length = isset($_GET[‘length‘]) ? $_GET[‘length‘] : 8;
  6. $db = new Connection();
  7. $data = $db->getList(‘select * from movie limit :offset,:length‘, array($offset, $length));
  8. $html = ‘‘;
  9. foreach ($data as $record) {
  10. $html .= sprintf(‘<li><a href="detail.php?id=%s">%s</a></li>‘,$record[‘movieId‘], $record[‘name‘]);
  11. }
  12. echo sprintf(‘<ul>%s</ul>‘, $html);

很明顯,列表頁的代碼變得簡潔,也更容易理解了。
我們通過程式設計語言提供的封裝手法,提取出了代碼中的重複部分。這樣,能讓我們少寫很多代碼,而且還能讓調用者的代碼變得更加簡潔。就“如何讓編程變得更簡單”而言,”把代碼封裝起來“便成了一個很不錯的思路。

而封裝本身還給我們帶來另外一個好處,那就是封裝了變化。
我們假設現在需要加入一種重試機制,多次嘗試串連資料庫,以防資料庫不穩定帶來的串連失敗。在現有封裝好的代碼裡,我們只需要修改資料庫連接的局部代碼,而List.php裡面對Connection的調用代碼,我們就基本不需要關心。由於封裝的緣故,這種改變對於List.php是不可見的。具體實現如下:

  1. class Connection
  2. {
  3. private $connection = ‘‘;
  4. public function __construct()
  5. {
  6. $count = 0;
  7. $connection = false;
  8. while(empty($connection) && $count < 3) {
  9. $connection = new PDO(‘mysql:host=localhost;dbname=test‘, ‘root‘, ‘‘);
  10. $count++;
  11. }
  12. $this->connection = $connection;
  13. }
  14. // 擷取多行資料
  15. public function getAll($sql){...}
  16. ... // 更多的資料操作方法
  17. }

封裝的這種特性,能讓我們在很小的範圍內,應對需求的最佳化和修改,很是方便。當然,有時候我們會發現封裝出來的東西,並不是那麼友好。這很大程度上取決於你封裝時抽象的角度,抽象和封裝,本身就是一件很見功夫的事情。不管怎樣,嘗試著去封裝一些東西吧,你很快會發現,這麼做是多麼的神奇和有趣。

php設計模式探秘(1)-封裝

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.