我最近正在开发一个网站应用程序,它基本上是一个客户/项目管理。 从一开始我就知道有必要将逻辑,视图和数据功能分开,以制作一个可以保留的更清晰的代码,所以我想到了一个3层方法。当我将理论付诸实践并开始编写代码时,问题和疑虑就开始了。
所以让我们从客户开始吧。
这就是我的Clients.class.php的样子。这在我看来并不好看,因为数据库查询不应该存在,它不是客户端的责任(是吗?),但是,我在哪里为客户和其他人放置CRUD操作,我在考虑制作对于需要与我的数据库一起操作的每个类对象的DAO,也许是连接到数据库的一般DAO抽象类,其他的将是孩子,这是正确的吗?
谈到与数据库的连接,这就是dbbconnect的实现方式,所有其他类都包含了这一点。
$user= '';
$pass= '';
$bdname= '';
try {
$pdo = new PDO('mysql:host=localhost;dbname=testing', $user, $pass);
}
catch (PDOException $e) {
exit('Database error.');
}
我确信这不是PDO应该如何使用的,因为我在其他类中全局使用这个$pdo
。我应该如何正确使用它?
最后,在从数据库中获取数据时,我有疑虑。当从数据库中获取一行(即一个客户端)时,我会将其映射到一个Object并将其作为客户端(而不是值数组)返回。当我提取所有客户端时,我应该返回一个对象数组吗?
我希望有人可以对这些疑惑有所启发,并提前感谢。
答案 0 :(得分:0)
有几个选项可供研究。坦率地说,你的“问题”中有不止一个问题。
关于对类进行建模,您可能会看到一些名为Data Driven Design的东西。这就是你所说的将模型和保存到数据库分成单独组件的内容。谷歌一点点,并阅读一些例子。
您可能还想查看一个名为ORM的内容。基本上它是一个抽象,因此您不必编写显式数据库查询。而是编写如何将对象映射到数据库表。
关于在全局范围内拥有PDO实例的问题:您想要使用称为Dependecy Injection的东西。查看Fabien Potencier(框架Symfony的作者)。在他的博客上,他写了一些关于为什么以及如何使用依赖注入的好帖子。
修改强>
在@FinalForm的一些友好建议之后,我会尝试举例说明你如何做到:
<?php
class Client {
private $id;
private $name;
private $email;
public function __construct($id, $name, $email) {
$this->setId($id);
$this->setName($name);
$this->setEmail($email);
}
public function setId($id) { $this->id = $id; }
public function getId() { return $this->id; }
public function setName($name) { $this->name = $name; }
public function getName() { return $this->name; }
public function setEmail($email) { $this->email = $email; }
public function getEmail() { return $this->email; }
}
class ClientFactory {
public function createClient($name, $email) {
return new Client(
$this->newID(),
$name,
$email
);
}
private function newID() {
// return a new id
}
}
class ClientDao {
private $dbh;
public function __construct(PDO $databaseHandler) {
$this->dbh = $databaseHandler;
}
// Create-method
public function persist(Client client) {
$query = $dbh->prepare("INSERT INTO clients (id, name, email) VALUES (:id, :name, :email)");
$query->execute(array(
'id' => client->getId(),
'name' => client->getName(),
'email' => client->getEmail()
));
}
// Create simelar methods for the rest of the CRUD-methods
}
// Usage
require 'config.php';
try {
$pdo = new PDO('mysql:host=localhost;dbname=testing', $user, $pass);
}
catch (PDOException $e) {
exit('Database error.');
}
$clientFactory = new ClientFactory();
$clientDao = new ClientDao($pdo);
$client1 = $clientFactory->createClient("Bob", "bob@gmail.com");
$client2 = $clientFactory->createClient("Dick", "dick@gmail.com");
$client3 = $clientFactory->createClient("Roger", "roger@gmail.com");
$clientDao->persist($client1);
$clientDao->persist($client2);
$clientDao->persist($client3);
我希望这可以解释你如何做到这一点。我们的想法是将对象的创建和保存分离到数据库。
答案 1 :(得分:-1)
K,假设它是一个直接的客户管理系统......
所以可能有一个“客户”表。表中的每一行都应该被视为一个对象。所以你有班级客户。实例化该类时,它可以表示表中的1行。来自该1行的数据将映射到该对象。也许你可以将Client子类化为多个客户端。所以你会做类Client扩展客户端{...}。 “Clients”类可用于表示表中的多个行。
所以会有:
类客户端扩展了客户端{...}
类客户端扩展了数据库{public function insert(){...}}
类数据库(见上文)将执行您想要的数据库操作。
因此,无论何时需要插入,都可以做类似的事情......
$ client = new Client();
$客户端 - &GT;的setName( “麦当劳”);
$ client-&gt; setRevenue(“20亿美元”);
$ client-&gt; insert($ client);
这样,所有类似客户端的模型级别类都可以创建并从基础数据库类中分类,在这些类中,它们都可以共享它的深层数据库用法。