无法使用 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
包含您从数据库加载的数据。
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
包含您从数据库加载的数据。