PHP PDO FETCH_INTO $ this(或替代)具有受保护或私有属性

时间:2014-02-25 11:37:32

标签: 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 = $db->prepare($sql);
        $stmt->setFetchMode(PDO::FETCH_INTO, $this);
        $stmt->execute($ins);
        $stmt->fetch();
    }
}

现在,如果这样做会很有意思,但是,当然,它不是$name是受保护的属性,因此我得到了错误。

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

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

1 个答案:

答案 0 :(得分:-1)

您在代码示例中的任何位置都没有使用$ name或$ this-&gt; 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);
    }

}
?>

我希望这会有所帮助。