无法使用 PDO::FETCH_CLASS 填充对象的属性

Can't populate properties of the object with PDO::FETCH_CLASS

PDO 在这种情况下如何工作?我做错了什么?我想,变量 $full 会输出 "John Smith",因为 class 的实例在两种情况下都是 $user。

我试过调试这段程序,我在 $first_name 上放置了一个观察器。当 degugger 进入 class 的范围时,我看到输出 "John".

我应该add/change在这段代码中得到输出"John Smith"?

// user.php file

    class User
    {
        ...
        private $first_name;
        private $last_name;

        public function findById($id = 0)
        {
            $sql = "SELECT * FROM " . $this->table . " WHERE id = :id";
            $params = [":id" => $id];
            $class = get_called_class();
            $result = $this->findBySql($sql, $params);
            return $this->db->fetchObject($result, $class);
        }

        public function findBySql($sql, $params = [])
        {
            return $this->db->query($sql, $params);
        }

        public function fullName()
        {
            return $this->first_name . " " . $this->last_name;
        }
    }

    // database.php file

    class DataBase
    {     
        ...

        public function fetchObject($stmt, $className = "stdClass")
        {
            $result = $stmt->fetchAll(PDO::FETCH_CLASS, $className);
            return $result[0];
        }
    }

    // index.php

    $user = new User();
    $found = $user->findById(1);
    $full = $user->fullName();
    var_dump($full); // output: string ' ' (length=1) -----> supposed: "John Smith"
    var_dump($found); /* output: object(User)[5]
      ....
      private 'first_name' => string 'John' (length=4)
      private 'last_name' => string 'Smith' (length=5)
      ....
    */

问题是 Database::fetchObject 正在返回 class 的新实例,而不是修改调用它的对象。使用:

public function findById($id = 0)
{
    $sql = "SELECT * FROM " . $this->table . " WHERE id = :id";
    $params = [":id" => $id];
    $class = get_called_class();
    $result = $this->findBySql($sql, $params);
    $user = $this->db->fetchObject($result, $class);
    $this->first_name = $user->first_name;
    $this->last_name = $user->last_name;
    return $this;
}

$user 是一个空对象,它的属性没有在任何地方设置。

当你调用 $user->findById(1) 时,它会调用 $db->fetchObject($result, "User");,后者会调用 $stmt->fetchAll(PDO::FETCH_CLASS, $className);,return 是一个新的 User 对象(实际上它是一个包含该对象的数组),与您创建的不同。

此对象已填充其属性,并由所有函数 return 编辑,然后存储在 $found 变量中,这是一个不同的变量,并且关联了不同的对象,而不是$user 变量。

您在 $user 变量上调用 fullName() 方法,该变量关联到一个空对象,因此 return 值是一个 space 字符( "" . " " . "").

的结果

您可以将 $user->fullName() 更改为 $found->fullName(),并且一切正常,因为 $found 包含您从数据库加载的数据。