【问题标题】:PHP PDO FETCH_INTO $this (or alternative) with protected or private properties [duplicate]PHP PDO FETCH_INTO $this(或替代)具有受保护或私有属性[重复]
【发布时间】:2014-02-26 00:36:25
【问题描述】:

我正在尝试为一个类创建一个 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 是受保护的属性,因此我得到了错误。

 Cannot access protected property User::$name yadda yadda....

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

【问题讨论】:

  • 如果获取成功,您可以使用stdClass,然后将其中的公共属性复制到您的受保护属性中?
  • 查看这个答案:stackoverflow.com/a/3296207/612202
  • 我已经实施了该答案中的建议。不过我不知道;感觉有点过分了!
  • 我同意,但正如答案中所述,PDO 无法访问私有成员,所以我看不到其他方法。
  • 我想的差不多;似乎很可惜!感谢 cmets。

标签: php pdo


【解决方案1】:

您没有在代码示例中的任何地方使用 $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();
    }
}

然后,当您实例化类时,您只需使用参数即可。

$cUser = new User('Fred');

经过一些澄清后添加:

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);
    }

}
?>

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

【讨论】:

  • 不,您的假设不正确。我的问题是如何在具有私有/受保护属性的类中使用 PDO 的 FETCH_INTO $this
  • 我已经修改了我的答案,现在我理解了这个问题
猜你喜欢
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 2017-12-13
  • 2014-12-14
  • 2011-01-09
  • 2014-11-03
  • 1970-01-01
  • 2012-06-22
相关资源
最近更新 更多