我正在尝试为类创建一个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....
所以,我花了一段时间在互联网上搜索尝试寻找替代方法,虽然我找到了一些可行的建议,但我希望有人能推荐一种方法。显然,我不想公开用户的属性或使用魔术设置器。
答案 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);
}
}
?>
我希望这会有所帮助。