我有一个使用魔术方法来存储属性的类.这是一个简化的例子:
class Foo {
protected $props;
public function __construct(array $props = array()) {
$this->props = $props;
}
public function __get($prop) {
return $this->props[$prop];
}
public function __set($prop, $val) {
$this->props[$prop] = $val;
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试为PDOStatement它的每个数据库行实例化此类的对象,就像这样(不起作用):
$st->setFetchMode(PDO::FETCH_CLASS, 'Foo');
foreach ($st as $row) {
var_dump($row);
}
Run Code Online (Sandbox Code Playgroud)
问题是,在设置属性值时,我的类PDO::FETCH_CLASS似乎没有触发魔术__set()方法.
如何使用PDO实现所需效果?
有哪些策略可用于为PHP类的私有成员创建访问器和更改器?这个建议是否合适:http://cormacscode.wordpress.com/2009/01/22/read-only-object-variables-in-php-using-magic-methods/
<?php
class classWithReadOnlyVar
{
private $readOnlyVar;
public function __get($varName)
{
return $this->$varName;
}
public function __set($varName,$varValue)
{
}
}
Run Code Online (Sandbox Code Playgroud)
如果某些成员需要私有,公共或受保护的财产方法怎么办?
我遇到了一段代码,其中PDO::FETCH_CLASS没有将类的名称作为参数传递,而是这样:
function getUsers() {
$DBH = $this->getDbh();
$query = "SELECT * FROM users";
try {
$STH = $DBH->query($query);
$users = $STH->fetchAll(PDO::FETCH_CLASS);
} catch(PDOException $e) {
}
return $users;
}
Run Code Online (Sandbox Code Playgroud)
现在,在官方文件中 它说:
如果fetch_style包含PDO :: FETCH_CLASSTYPE(例如PDO :: FETCH_CLASS | PDO :: FETCH_CLASSTYPE),则类的名称由第一列的值确定.
所以我不确定我究竟是什么意思,也不知道它是如何运作的.假设我有users一张记录表
那怎么能PDO::FETCH_CLASS知道什么是班级名字?我可以用类名添加列到我的记录中,FETCH_CLASS从数据库中获取类名吗?记录结构的例子将受到高度赞赏...... thx
*我正在测试这个类而不是作者,所以更改类是无关紧要的