class vs functions oop

时间:2013-06-22 09:05:25

标签: php oop

我是oops的新手..

我正在阅读这本书Php 5 social networking,这本书给出了一步一步的解释 使用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的主要目的是允许应用程序优雅地进化 根据不断变化的要求(来源:Design Patterns explained a new persective),他们给出了一些很好的例子 在这本书中解释这一点。

所以我的问题是应用程序中的需求可能发生的变化将保证使用数据库类 在这种情况下管理,而不是让我们说使用一堆功能来完成工作?

我在codeigniter中看到了同样的事情,数据库类位于DB_driver.phpDB_active_rec.php.中 如果他们将这些db函数放在一个帮助文件中而不是将它放在库中会有什么不同呢?

我已经完成了本论坛的答案,但没有人回答 从需求的角度来看这个问题

谢谢..

1 个答案:

答案 0 :(得分: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.