PDO如何在这种情况下工作?我做错了什么?我想,变量$ full会输出" John Smith" ,因为在这两种情况下,类的实例都是$ user。
我试图调试这个程序,我已经把一个观察者放在了$ first_name上。当degugger进入课程范围时,我会看到输出" John"。
我应该在此代码中添加/更改以获得输出" John Smith" ?
protected
答案 0 :(得分:1)
问题是Database::fetchObject
正在返回类的新实例,而不是修改调用它的对象。使用:
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;
}
答案 1 :(得分:0)
$user
是一个空对象,其属性未在任何地方设置。
当您致电$user->findById(1)
时,会调用$db->fetchObject($result, "User");
,调用$stmt->fetchAll(PDO::FETCH_CLASS, $className);
,它会返回一个新的User对象(实际上它是一个包含该对象的数组),与您创建的不同
此对象的属性已填充,并由所有函数返回,然后存储在$found
变量中,该变量是一个不同的变量,并且具有与$user
变量关联的不同对象
您在fullName()
变量上调用$user
方法,该变量与空对象关联,因此返回值是空格字符("" . " " . ""
的结果)。
您可以按$user->fullName()
更改$found->fullName()
,并且一切都应该正常,因为$found
包含您从数据库加载的数据。