當開發者第一次接觸 PHP 時,通常會使用類似下面的代碼來將數據庫的交互與表示層邏輯混在一起:
~~~
<ul>
<?php
foreach ($db->query('SELECT * FROM table') as $row) {
echo "<li>".$row['field1']." - ".$row['field1']."</li>";
}
?>
</ul>
~~~
這從很多方面來看都是錯誤的做法,主要是由于它不易閱讀又難以測試和調試。而且如果你不加以限制的話,它會輸出非常多的字段。
其實還有許多不同的解決方案來完成這項工作 — 取決于你傾向于 [面向對象編程(OOP)](http://laravel-china.github.io/#object-oriented-programming)還是[函數式編程](http://laravel-china.github.io/#functional-programming) — 但必須有一些分離的元素。
來看一下最基本的做法:
~~~
<?php
function getAllFoos($db) {
return $db->query('SELECT * FROM table');
}
foreach (getAllFoos($db) as $row) {
echo "<li>".$row['field1']." - ".$row['field1']."</li>"; // BAD!!
}
~~~
這是一個不錯的開頭。將這兩個元素放入了兩個不同的文件于是你得到了一些干凈的分離。
創建一個類來放置上面的函數,你就得到了一個「Model」。創建一個簡單的`.php`文件來存放表示邏輯,你就得到了一個「View」。這已經很接近 [MVC](http://code.tutsplus.com/tutorials/mvc-for-noobs--net-10488) — 一個大多數[框架](http://laravel-china.github.io/#frameworks)常用的面向對象的架構。
foo.php
~~~
<?php
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'username', 'password');
// Make your model available
include 'models/FooModel.php';
// Create an instance
$fooModel = new FooModel($db);
// Get the list of Foos
$fooList = $fooModel->getAllFoos();
// Show the view
include 'views/foo-list.php';
models/FooModel.php
<?php
class FooModel
{
protected $db;
public function __construct(PDO $db)
{
$this->db = $db;
}
public function getAllFoos() {
return $this->db->query('SELECT * FROM table');
}
}
~~~
views/foo-list.php
~~~
<?php foreach ($fooList as $row): ?>
<?= $row['field1'] ?> - <?= $row['field1'] ?>
<?php endforeach ?>
~~~
向大多數現代框架的做法學習是很有必要的,盡管多了一些手動的工作。你可以并不需要每一次都完全這么做,但將太多的表示邏輯層代碼和數據庫交互摻雜在一些將會為你在想要對程序進行[單元測試](http://laravel-china.github.io/#unit-testing)時帶來真正的麻煩。
[PHPBridge](http://phpbridge.org/) 具有一項非常棒的資源叫做[創建一個數據類](http://phpbridge.org/intro-to-php/creating_a_data_class)。它包含了非常相似的邏輯而且非常適合剛剛習慣數據庫交互概念的開發者使用。
- 歡迎
- 入門指南
- 使用當前穩定版本
- 內置的WEB服務器
- Mac安裝
- Windows安裝
- 代碼風格指南
- 語言亮點
- 編程范式
- 命名空間
- PHP標準庫
- 命令行接口
- Xdebug
- 依賴管理
- Composer 與 Packagist
- PEAR
- 開發實踐
- 基礎知識
- 日期和時間
- 設計模式
- 使用UTF8編碼
- 依賴注入
- 基本概念
- 復雜的問題
- 容器
- 延伸閱讀
- 數據庫
- MYSQL 擴展
- PDO 擴展
- 數據庫交互
- 數據庫抽象層
- 使用模板
- 好處
- 原生PHP模板
- 編譯模板
- 延伸閱讀
- 錯誤與異常
- 錯誤
- 異常
- 安全
- Web應用程序安全
- 密碼哈希
- 數據過濾
- 配置文件
- 注冊全局變量
- 錯誤報告
- 測試
- 測試驅動開發
- 行為驅動開發
- 其他測試工具
- 服務器與部署
- Platform as a Service (PaaS)
- 虛擬或專用服務器
- 共享服務器
- 構建及部署應用
- 虛擬化
- Vagrant
- Docker
- 緩存
- Opcode緩存
- 對象緩存
- 文檔撰寫
- 資源
- 社區
- Credits