就在最近我开始自己重写一个以前程序编写的网站,我选择 PDO 作为包装器,因为我也习惯了 OOP 的做事方式。我想要一些关于类结构的建议。
大部分都是数据库驱动的,比如添加类别和子类别、产品品牌、产品、用户等。我想它们中的每一个都可以是一个类,因为我需要对它们进行 CRUD 操作,所以我需要一种通用的插入方式,更新,删除MySql数据库中的记录。问题不在于代码,我想(并且已经)根据我的需要自己编写一些 CRUD 操作,真正的问题是结构以及我将如何正确分发和扩展这些类。
现在我已经编写了 3 种不同的方法:
一个名为“Operations”的类,它将被所有其他需要 CRUD 函数的类扩展,该类包含非常通用的属性,例如 $id、$atributes、$fields 和 $table,当然还有插入、更新的通用方法, 删除。这样我就可以创建,假设我的 Product 对象带有一些参数(名称、类别、价格)并立即 Product->insert() 将其放入数据库,而无需将任何参数传递给插入函数。此类中的 CRUD 函数不接受参数,它们依赖于创建对象的属性。
与上面相同,但 CRUD 函数接受参数,使它们(我想)更通用,以防我只需要插入一些东西而不用之前创建具有无用属性的对象。
'Operations'类扩展了PDO,工作方式与2类似,但现在我创建数据库连接时可以直接访问它们,而不依赖于其他对象。
我倾向于第一个选项,因为我认为,在大多数情况下,它将满足我对这个网站所做的一切,同样,该网站已经编码但在程序上,这一直是一团糟,所以基本上我需要重新做的事情,但OO。
除了 CMS 或已经编码的包装器(这样做的目的是学习 PDO 并习惯 OOP),这将是最好的方法吗?不限于我提到的选项。
这是迄今为止我设法编写的“操作”类,我一直在做类似沙盒的测试,不要介意西班牙语变量名。也欢迎有关代码的建议。
class Operaciones {
private $database;
protected $id;
protected $atributos;
protected $tabla;
protected $campos;
public function __construct($link) {
$this->database = $link;
}
public function insertar() {
if (!$this->verificarCamposNulos($this->atributos, $this->campos))
echo 'Campos nulos<br />';
else {
$this->prepararCampos();
$placeholders = $this->generarPlaceholders();
$stmt = $this->database->prepare("INSERT INTO {$this->tabla} ({$this->campos}) VALUES ({$placeholders})");
$valores = array_values($this->atributos);
$stmt->execute($valores);
$stmt = NULL;
echo 'Se ha insertado exitosamente';
}
}
public function modificar() {
if (!$this->verificarCamposNulos() || empty($this->id))
echo 'Campos nulos<br />';
else {
$this->prepararCampos('=?');
$stmt = $this->database->prepare("UPDATE {$this->tabla} SET {$this->campos} WHERE id = {$this->id}");
$valores = array_values($this->atributos);
$stmt->execute($valores);
$stmt = NULL;
echo 'Se ha modificado exitosamente';
}
}
private function generarPlaceholders() {
for($i=0;$i<count($this->atributos);$i++)
$qmarks[$i] = '?';
return implode(',', $qmarks);
}
// Check if the values to be inserted are NULL, depending on the field format given
private function verificarCamposNulos() {
$n_campos = explode(',', $this->campos);
$valores = array_values($this->atributos);
foreach($n_campos as $i => $result) {
if (strstr($result, '@'))
if (empty($valores[$i]))
return false;
}
return true;
}
// Removes the '@' from each field, used to check which fields are NOT NULL in mysql
private function prepararCampos($sufijo = NULL) {
$n_campos = explode(',', $this->campos);
foreach($n_campos as $i => $result)
$n_campos[$i] = str_replace('@', '', $result) . $sufijo;
$this->campos = implode(',', $n_campos);
}
}