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