0

我正在尝试在 PHP 中创建我的第一个类。

下面的工作正常,如预期的那样。但据我所知,有一种extend方法可以直接调用方法。所以我在想,即使下面的代码有效,也可能是一个糟糕的代码。我希望了解如何使用正确的编码方式来获得相同的结果。感谢您的任何建议:

$game = new game();

$select = $game->db->select('users', '*');
print_r($select);

以上从数据库中选择数据并正确返回值。

这是游戏类:

class game {
    public $db;

    function __construct() {
        $this->db = new db();
    }

}

这是 DB 类,现在它被插入到游戏类的结构中,但我需要知道这是否是正确的编码方式,或者我是否应该扩展类或其他:

class db {

    private $options;
    private $pdo;

    function __construct() {
        $this->options = array(
            'database_host' => DATABASE_HOST,
            'database_name' => DATABASE_NAME,
            'database_user' => DATABASE_USER,
            'database_pass' => DATABASE_PASS
        );

        $this->connect();

    }

    private function connect() {
        try {
            $this->pdo = new PDO('mysql:host=' . $this->options['database_host'] . ';dbname=' . $this->options['database_name'], $this->options['database_user'], $this->options['database_pass']);
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->pdo->exec("set names utf8");
        } catch (PDOException $e) {
            echo 'ERROR: ' . $e->getMessage();
        }
    }

    public function select($table, $what, $where = NULL, $custom = NULL) {
        $query = "SELECT " . $what . " FROM " . $table;
        $child = "1";
        $param = array();
        if ($where)
            foreach ($where as $data => $value) {
                if ($child == "1") {
                    $query .= " WHERE " . $data . " = '" . $value . "'";
                    $param[":" . $data] = $value;
                    $child = "next";
                } else {
                    $query .= " AND " . $data . " = '" . $value . "'";
                    $param[":" . $data] = $value;
                }
            }

        if ($custom)
            $query .= ' ' . $custom;

        $statement = $this->pdo->prepare($query);
        if ($statement->execute($param))
            return $statement->fetchAll(PDO::FETCH_ASSOC);
        return false;
    }

}
4

1 回答 1

3

我不会扩展 DB 类,但我也不会在某些构造函数中实例化它。而是使用依赖注入并将 DB 对象传递给构造函数:

class game {

    protected $db;

    function __construct( db $db ) {
        $this->db = $db
    }

}

实例化:

/* global variable database or from object storage */
$database = new db( /* … */ );

$game = new Game( $database );

您可以扩展 PDO 类来实现用户功能。这样你就可以传递一个 PDO 对象,也可以使你自己的选择函数可用。

class db extends \PDO {
    /* … */
}
于 2013-07-10T09:55:00.090 回答