PHP PDO使用受保护或私有属性将_提取到$this(或其他)中

PHP PDO使用受保护或私有属性将_提取到$this(或其他)中,php,pdo,Php,Pdo,我试图为一个类创建一个fetch方法;以下是一个(可能过于)简化的示例: <?php class User { protected $name; public function fetch($id) { global $db; $sql = "SELECT [name] FROM [user] WHERE [id] = :id"; $ins = array ('id' => $id); $stmt = $

我试图为一个类创建一个fetch方法;以下是一个(可能过于)简化的示例:

<?php
class User {
    protected $name;
    public function fetch($id) {
        global $db;
        $sql = "SELECT [name] FROM [user] WHERE [id] = :id";
        $ins = array ('id' => $id);
        $stmt = $db->prepare($sql);
        $stmt->setFetchMode(PDO::FETCH_INTO, $this);
        $stmt->execute($ins);
        $stmt->fetch();
    }
}

所以,我花了一段时间在互联网上搜索,试图找到一种替代方法。虽然我找到了一些可行的建议,但我希望有人能够推荐一种方法。显然,我不想公开用户的属性或使用魔法设置器。

在代码示例中的任何地方都没有使用$name或$this->name,因此我假设您试图从对象外部设置$name属性

那么,为什么不将该值传递给构造函数方法呢

<?php
class User {
    protected $name;

    public function __construct($name) 
    {
        $this->name = $name;
    }

    public function fetch($id) {
        global $db;
        $sql = "SELECT [name] FROM [user] WHERE [id] = :id";
        $ins = array ('id' => $id);
        $stmt = $db->prepare($sql);
        $stmt->setFetchMode(PDO::FETCH_INTO, $this);
        $stmt->execute($ins);
        $stmt->fetch();
    }
}
澄清后添加:

PDO::FETCH_INTO:更新请求类的现有实例,将结果集的列映射到类中的命名属性

因此,在运行setFetchMode()和fetch()之前,必须先有一个现有的实例化对象将数据放入其中,其中属性名与查询结果中的部分或所有行匹配

<?php
class User {
    protected $row;

    public function fetch($id) {
        global $db;

        $sql = "SELECT * FROM user WHERE id = :id";
        $ins = array ('id' => $id);
        $stmt = $db->prepare($sql);
        $stmt->execute($ins);

        // Create a class 
        $this->row = new stdClass();

        // Now creates the properties you are interested in
        $this->row->name = '';
        $this->row->dob = '';
        $this->row->email = '';

        $stmt->setFetchMode(PDO::FETCH_INTO, $this->row);
        $stmt->fetch();

        print_r($this->row);
    }

}
?>


我希望这能提供更多帮助。

如果获取成功,您可以使用
stdClass
,然后将其中的公共属性复制到受保护的属性中。请检查此答案:我已经实现了该答案中的建议。但我不知道;感觉有点过分了!我同意,但正如回答中所述,PDO无法访问私人成员,因此我不认为有其他方法可以做到这一点;看起来很遗憾!谢谢你的评论。不,你的假设是错误的。我的问题是如何在一个具有私有/受保护属性的类中使用PDO的FETCH_INTO$this。我已经修改了我的答案,现在我理解了这个问题
$cUser = new User('Fred');
<?php
class User {
    protected $row;

    public function fetch($id) {
        global $db;

        $sql = "SELECT * FROM user WHERE id = :id";
        $ins = array ('id' => $id);
        $stmt = $db->prepare($sql);
        $stmt->execute($ins);

        // Create a class 
        $this->row = new stdClass();

        // Now creates the properties you are interested in
        $this->row->name = '';
        $this->row->dob = '';
        $this->row->email = '';

        $stmt->setFetchMode(PDO::FETCH_INTO, $this->row);
        $stmt->fetch();

        print_r($this->row);
    }

}
?>