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

PHP类应该如何与MySQL数据库交互?,php,mysql,Php,Mysql,前几天,在开发我的PHP项目并实现User类时,我开始想知道这个类应该如何与项目使用的MySQL数据库交互 让我从一个例子开始:假设我在User类中有一个getName()方法,它返回用户的真实姓名。实现该方法的更合适的方法是什么 我提出了两个解决方案: 我将DB查询放在getName()中,只得到我需要的东西,如下所示: public function getName() { // MySQL query code here } private $name; // Load al

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

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

我提出了两个解决方案:

  • 我将DB查询放在
    getName()
    中,只得到我需要的东西,如下所示:

    public function getName() {
    
        // MySQL query code here
    }
    
    private $name;
    
    // Load all user data inside the class' structure
    public function load() {
    
        $this->name = // MySQL query here
    }
    
    public function getName() {
    
        return $this->name;
    }
    
  • 我在
    User
    类中创建了一个
    load()
    方法,加载类结构中的所有用户数据,然后
    getName()
    如下所示:

    public function getName() {
    
        // MySQL query code here
    }
    
    private $name;
    
    // Load all user data inside the class' structure
    public function load() {
    
        $this->name = // MySQL query here
    }
    
    public function getName() {
    
        return $this->name;
    }
    
  • 我想,不确定是否错误,第一种方法更有效,因为我只获取我需要的数据,而第二种方法更面向对象,但效率更低


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

    及时运行查询并只运行一次(除非您知道该值可能会更改),请尝试以下操作:

     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'];
       }
    
     }
    

    除了这个问题有点广泛(因为有无数的模式),您提到的第二种方式在IMO中更好,为了补充这一点,我还建议提供ID作为一个参数,您可以使用它构建一个查询,以按ID获取用户,然后手动分配所有属性(从获取的行)

    也检查懒惰加载和

    两种方式,考虑存储/缓存结果,这样每次使用该对象上的GETNEY时,都不会进行查询。此外,考虑不要使用ORM/DBAL解决方案,如PROPLE或Orthic,也检查懒惰加载和活动记录模式@ and ReScSerji,发现您的评论非常有用。如果你写下答案,我会标记:)你不认为在一个查询中读取6个字段的开销值得不做6个查询,因此,加载应该加载相关表中的所有列吗?@AndreschSerj加载所有列最好,而不是$this->data['name'],可能只是
    $this->data=getQueryResultsarra();我的确切意思是:D