我正在尝试用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;
}
}
我不会扩展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 {
/* … */
}