PHP类应该如何与MySQL数据库交互?

时间:2014-04-03 09:04:06

标签: php mysql

前几天,在开发我的PHP项目并实现User类时,我开始想知道这个类应该如何与项目正在使用的MySQL数据库进行交互。

让我先举一个例子:让我说我在getName()类中有一个User方法,它返回用户的真实姓名。实现该方法的更合适的方法是什么?

我想出了两个解决方案:

  1. 我把数据库查询放在getName()里面,只得到我需要的东西:

    public function getName() {
    
        // MySQL query code here
    }
    
  2. 我在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;
    }
    
  3. 我想,不确定是否错误,第一种方式更有效,因为我只获得了我需要的数据,而第二种方式是更多的OOP但效率更低。

    所以,问题在于:什么是更好的方法?为什么?还有更好的方法吗?

3 个答案:

答案 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获取用户,然后手动分配所有属性(从获取的行)。