前几天,在开发我的PHP项目并实现User
类时,我开始想知道这个类应该如何与项目正在使用的MySQL数据库进行交互。
让我先举一个例子:让我说我在getName()
类中有一个User
方法,它返回用户的真实姓名。实现该方法的更合适的方法是什么?
我想出了两个解决方案:
我把数据库查询放在getName()
里面,只得到我需要的东西:
public function getName() {
// MySQL query code here
}
我在load()
类中创建了一个User
方法,用于加载类结构中的所有用户数据,然后getName()
就是这样:
private $name;
// Load all user data inside the class' structure
public function load() {
$this->name = // MySQL query here
}
public function getName() {
return $this->name;
}
我想,不确定是否错误,第一种方式更有效,因为我只获得了我需要的数据,而第二种方式是更多的OOP但效率更低。
所以,问题在于:什么是更好的方法?为什么?还有更好的方法吗?
答案 0 :(得分:1)
及时运行您的查询并仅运行一次(除非您知道值可能会更改),请尝试以下操作:
class User {
protected $data;
function getName()
{
if (!isset($data['name'])) {
// if you can load more than just $this->data['name'] in one query
// you probably should.
$this->data['name'] = // query here
}
return $this->data['name'];
}
}
答案 1 :(得分:1)
无论哪种方式,考虑存储/缓存其结果,这样每次在该对象上使用getName时都不会进行查询。 另外,请考虑使用像propel or doctrine这样的ORM / DBAL解决方案来解决所有问题。
另请查看延迟加载和Active Record Pattern
答案 2 :(得分:0)
除了有点宽泛的问题(因为有无数的模式),你提到的第二种方式是更好的IMO,并且添加到它我还建议提供ID作为参数,然后你可以用它来构建一个查询以按ID获取用户,然后手动分配所有属性(从获取的行)。