我是新手,哎呀..
我正在阅读这本书Php 5 社交网络,这本书逐步解释了使用 oops 从头开始创建社交网站。
本书给出的第一步是为下面给出的任务创建一堆核心类:
数据库访问
模板管理
验证
电子邮件发送
网址处理
然后他们使用了一个 Registry 类来包装这些对象。
这是数据库访问类的代码:
/**
* Database management / access class: basic abstraction
*
* @author Michael Peacock
* @version 1.0
*
*/
class Mysqldb {
/**
* Allows multiple database connections
* each connection is stored as an element in the array, and the
* active connection is maintained in a variable (see below)
*/
private $connections = array();
/**
* Tells the DB object which connection to use
* setActiveConnection($id) allows us to change this
*/
private $activeConnection = 0;
/**
* Queries which have been executed and the results cached for
* later, primarily for use within the template engine
*/
private $queryCache = array();
/**
* Data which has been prepared and then cached for later usage,
* primarily within the template engine
*/
private $dataCache = array();
/**
* Number of queries made during execution process
*/
private $queryCounter = 0;
/**
* Record of the last query
*/
private $last;
/**
* Reference to the registry object
*/
private $registry;
/**
* Construct our database object
*/
public function __construct(Registry $registry) {
$this->registry = $registry;
}
/**
* Create a new database connection
* @param String database hostname
* @param String database username
* @param String database password
* @param String database we are using
* @return int the id of the new connection
*
*/
public function newConnection($host, $user, $password, $database) {
$this->connections[] = new mysqli($host, $user, $password, $database);
$connection_id = count($this->connections) - 1;
if (mysqli_connect_errno()) {
trigger_error('Error connecting to host. ' . $this->connections[$connection_id]->error, E_USER_ERROR);
}
return $connection_id;
}
/**
* Change which database connection is actively used for the next
* operation
* @param int the new connection id
* @return void
*
*/
public function setActiveConnection(int $new) {
$this->activeConnection = $new;
}
/**
* Execute a query string
* @param String the query
* @return void
*
*/
public function executeQuery($queryStr) {
if (! $result = $this->connections[$this->activeConnection]->query($queryStr))
{
trigger_error('Error executing query: ' . $queryStr . ' -
' . $this->connections[$this->activeConnection]->error, E_USER_ERROR);
} else
{
$this->last = $result;
}
}
/**
* Get the rows from the most recently executed query, excluding
* cached queries
* @return array
*
*/
public function getRows() {
return $this->last->fetch_array(MYSQLI_ASSOC);
}
/**
* Delete records from the database
* @param String the table to remove rows from
* @param String the condition for which rows are to be removed
* @param int the number of rows to be removed
* @return void
*
*/
public function deleteRecords($table, $condition, $limit) {
$limit = ($limit == '') ? '' : ' LIMIT ' . $limit;
$delete = "DELETE FROM {$table} WHERE {$condition} {$limit}";
$this->executeQuery($delete);
}
/**
* Update records in the database
* @param String the table
* @param array of changes field => value
* @param String the condition
* @return bool
*
*/
public function updateRecords($table, $changes, $condition) {
$update = "UPDATE " . $table . " SET ";
foreach($changes as $field => $value) {
$update .= "`" . $field . "`='{$value}',";
}
// remove our trailing ,
$update = substr($update, 0, - 1);
if ($condition != '') {
$update .= "WHERE " . $condition;
}
$this->executeQuery($update);
return true;
}
/**
* Insert records into the database
* @param String the database table
* @param array data to insert field => value
* @return bool
*
*/
public function insertRecords($table, $data) {
// setup some variables for fields and values
$fields = "";
$values = "";
// populate them
foreach($data as $f => $v) {
$fields .= "`$f`,";
$values .= (is_numeric($v) && (intval($v) == $v)) ? $v . "," : "'$v',";
}
// remove our trailing ,
$fields = substr($fields, 0, - 1);
// remove our trailing ,
$values = substr($values, 0, - 1);
$insert = "INSERT INTO $table ({$fields}) VALUES({$values})";
// echo $insert;
$this->executeQuery($insert);
return true;
}
/**
* Sanitize data
* @param String the data to be sanitized
* @return String the sanitized data
*
*/
public function sanitizeData($value) {
// Stripslashes
if (get_magic_quotes_gpc()) {
$value = stripslashes($value);
}
// Quote value
if (version_compare(phpversion(), "4.3.0") == "-1") {
$value = $this->connections[$this->activeConnection]->escape_string($value);
} else {
$value = $this->connections[$this->activeConnection]->real_escape_string($value);
}
return $value;
}
/**
* Get the rows from the most recently executed query, excluding
* cached queries
* @return array
*
*/
public function getRows() {
return $this->last->fetch_array(MYSQLI_ASSOC);
}
public function numRows() {
return $this->last->num_rows;
}
/**
* Gets the number of affected rows from the previous query
* @return int the number of affected rows
*
*/
public function affectedRows() {
return $this->last->affected_rows;
}
/**
* Deconstruct the object
* close all of the database connections
*/
public function __deconstruct() {
foreach($this->connections as $connection) {
$connection->close();
}
}
}
据我了解,使用 oops 的主要目的是让应用程序优雅地发展以适应不断变化的需求(来源:设计模式解释了一个新的观点),他们在本书中给出了一些很好的例子来解释这一点。
所以我的问题是,在这种情况下,应用程序中的需求可能发生的变化会保证使用一个类进行数据库管理,而不是说使用一堆函数来完成工作?
codeigniter
我在数据库类所在的位置也看到了同样的情况,如果他们将这些 db 函数放在帮助文件中DB_driver.php
而DB_active_rec.php.
不是放在库中会有什么不同?
我已经浏览了这个论坛中给出的答案,但他们都没有从需求的角度回答这个问题
谢谢..