0

我是新手,哎呀..

我正在阅读这本书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.phpDB_active_rec.php. 不是放在库中会有什么不同?

我已经浏览了这个论坛中给出的答案,但他们都没有从需求的角度回答这个问题

谢谢..

4

1 回答 1

2

将逻辑放在类中主要是为了便于组织,但在公共上下文之间如何共享数据方面有一些优势。当您将它们封装到不同的类中时,您可以创建代码的物理分离,这dbtemplate将它们放在仅包含函数的多个文件中不同。类允许将功能组合在一起并设置数据共享的范围。

如果您需要任何示例,请告诉我。但你似乎知道你在说什么。

根据您在下面的评论,我想到了可以添加到这篇文章中的更多内容。

当你开始思考时OO,你的思维就会发生范式转变。在一切开始变得有意义之前,它必须发生在你的大脑中。如果您继续认为程序像我需要这样做,那么我需要一个函数。想我需要这样做,为什么?它是什么?然后用它构造一个对象,想想我还能用它做什么?我怎样才能很好地组织它,以便我也可以与其他人分享。If when i do other things with it if there is a common resource i need to access how do i keep reference to it.

于 2013-06-22T09:11:31.540 回答