?
本文檔使用 php中文網(wǎng)手冊 發(fā)布
當(dāng)開發(fā)者第一次接觸 PHP 時,通常會使用類似下面的代碼來將數(shù)據(jù)庫的交互與表示層邏輯混在一起:
<ul> <?php foreach ($db->query('SELECT * FROM table') as $row) { echo "<li>".$row['field1']." - ".$row['field1']."</li>"; } ?> </ul>
這從任何方面來看都是錯誤的做法,主要是由于它不易調(diào)試,難以閱讀和測試。而且如果你不加以限制的話,它會輸出非常多的字段。
其實(shí)還有許多不同的解決方案來完成這項(xiàng)工作 — 取決于你傾向于 面向?qū)ο缶幊蹋∣OP)還是函數(shù)式編程 — 但必須有一些分離的元素。
來看一下最基本的做法:
<?php function getAllFoos($db) { return $db->query('SELECT * FROM table'); } foreach (getAllFoos($db) as $row) { echo "<li>".$row['field1']." - ".$row['field1']."</li>"; // BAD!! }
這是一個不錯的開頭。將這兩個元素放入了兩個不同的文件于是你得到了一些干凈的分離。
創(chuàng)建一個類來放置上面的函數(shù),你就得到了一個「Model」。創(chuàng)建一個簡單的.php文件來存放表示邏輯,你就得到了一個「View」。這已經(jīng)很接近 MVC— 一個大多數(shù)框架常用的面向?qū)ο蟮募軜?gòu)。
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 ?>
向大多數(shù)現(xiàn)代框架的做法學(xué)習(xí)是很有必要的,盡管多了一些手動的工作。你可以并不需要每一次都完全這么做,但將太多的表示邏輯層代碼和數(shù)據(jù)庫交互摻雜在一些將會為你在想要對程序進(jìn)行單元測試時帶來真正的麻煩。
PHPBridge 具有一項(xiàng)非常棒的資源叫做創(chuàng)建一個數(shù)據(jù)類。它包含了非常相似的邏輯而且非常適合剛剛習(xí)慣數(shù)據(jù)庫交互概念的開發(fā)者使用。