【问题标题】:Setting an object returned from PDO in its own class在自己的类中设置从 PDO 返回的对象
【发布时间】:2012-02-26 14:34:26
【问题描述】:

我有一个名为Admin 的类,它的字段与我在数据库中的admins 表中的字段完全相同:idemailpwhashpwnonce、@ 987654327@,permissions.

我的班级看起来像这样(简化了):

class Admin {
    var $id, $email, $pwhash, $pwnonce, $name, $permissions;

    function auth() {
        // checks the session and attempts to authenticate the user
    }

    function login($email,$pw) {
        // authenticate the user and start a session for them.
    }
}

问题是,我想用 PDO 来获取一个使用当前类的对象,并将它分配给当前对象。

以前,我获取一个 assoc 数组并一一分配所有变量,但现在,由于我正在更改我的系统以使用 PDO,我想让它返回一个 Admin 的实例类,我分配给当前类。

例如,在auth()方法中,应该是这样的:

function auth() {
     if (!isset($_SESSION['id'])) return false;
     $id = $_SESSION['id'];

     // create PDO connection and assign to $dbh

     $sth = $dbh->prepare('SELECT * FROM admins WHERE id = ?');
     $sth->execute(array($id));
     $sth->setFetchMode(PDO::FETCH_CLASS,get_class($this));
     $obj = $sth->fetch();
     if (!is_object($obj)) return false;

     $this = $obj; // I know this won't work, but anyway...
}

所以我尝试了,正如我所怀疑的那样,它不会让我分配 $this 的值。但是我还是想使用PDO的对象映射功能,那么如何将PDO返回的对象分配给我所在的实例呢?

【问题讨论】:

  • 什么是$this->getClass(),它返回什么?它应该将类的名称作为字符串返回。
  • @FrancisAvila 呜呜——我的意思是get_class($this)

标签: php mysql pdo


【解决方案1】:

如果要获取给定类的新对象,请使用PDO::FETCH_CLASS。但是,如果您想将属性值写入您已经拥有的现有对象,请使用PDO::FETCH_INTO,如下所示:

 $sth->setFetchMode(PDO::FETCH_INTO, $this);
 $sth->execute();
 $sth->fetch();

请注意,您要写入的属性必须是可公开访问的,可以直接访问,也可以通过 __set() 魔术方法访问。

但是,您应该仔细考虑@Truth 的回答。让同一个类(更不用说同一个object!)同时负责数据库访问和表示记录,这不是一个好的设计。让一个班级负责管理授权记录,另一个班级负责记录本身。

【讨论】:

    【解决方案2】:

    然后尝试覆盖$this,返回有问题的对象:

    return $obj;
    

    然后像这样使用它:

    $admin = $admin->auth();
    

    这将覆盖当前的管理对象。


    虽然更好的方法是将变量分配给当前对象,或者使用抽象类,但这会更有意义。

    试着大声说出你在做什么。您将Admin 告诉auth(),然后将其自身替换为经过身份验证的新Admin。相反,您应该让AdminManager 处理身份验证请求,并返回一个Admin 对象,或者让Admin 本身进行身份验证,然后在同一对象中填写详细信息。

    除了有意义之外,您还可以防止应用程序中的重复和内存泄漏。

    【讨论】:

      【解决方案3】:

      您可以使用overloading 将每次调用重定向到您的数据库对象。

      class Admin {
        function auth() {
          // [...]
      
          $this->pdo_obj = $obj;
        }
      
        function __get($attribute) {
          return $this->pdo_obj->$attribute;
        }
      
        // Implement __set, __isset, ... here
      }
      

      【讨论】:

        【解决方案4】:

        您命名为 $obj 的变量被分配了一个关联数组,这是 fetch() 返回的内容。该数组中的每个元素都有一个作为表列名的键和一个作为该行和该列的值的值。由于您的类中有对应于相同的实例变量,因此您可以将它们设置为:

        $this->id = $obj['id'];
        $this->email = $obj['email'];
        

        ...等每个。

        【讨论】:

        • 我以为这就是PDO::FETCH_ASSOC 的用途?我正在使用PDO::FETCH_CLASS
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-13
        • 2012-08-05
        • 2012-06-30
        • 2018-03-11
        相关资源
        最近更新 更多