很简短的问题,这是一个例子:
$prepared = $this->pdo->prepare("SELECT * FROM Users WHERE ID = :ID");
$statement = $prepared->execute(array(":ID" => $User_ID))
$result = $statement->fetchAll(PDO::FETCH_CLASS, "User");
//OR
$User = new User();
$result = $statement->fetch(PDO::FETCH_INTO, $User);
(从头顶写,可能包含语法错误)
这两个是否直接获取所述对象的私有属性?
我读它也绕过__construct
函数,它也会绕过私有状态吗?
答案 0 :(得分:7)
答案非常简短:是的。
class Foo
{
private $id;
public function echoID()
{
echo $this->id;
}
}
$result = $statement->fetchAll(PDO::FETCH_CLASS, "Foo");
$result[0]->echoID(); // your ID
除了:
这会导致语法错误$statement->fetchAll(PDO::FETCH_INTO, $User);
。您无法将FETCH_INTO
与fetchAll
方法一起使用。
答案 1 :(得分:1)
但是PDO :: FETCH_CLASS的事件对于子类的私有属性存在问题。 E.g。
class Animal
{
private $color;
public function getColor()
{
return $this->color;
}
}
class Cat extends Animal
{
}
$statement->setFetchMode(PDO::FETCH_CLASS, "Cat" );
$someCat = $statement->fetch();
echo $someCat->getColor(); //empty
print_r( $someCat );
/*
now have strange output like:
[color:Animal:private] =>
[color] => grey
*/
但是如果你将属性设置为受保护 - 它可以正常工作
答案 2 :(得分:0)
您无法访问超类上的私有属性的原因是因为这些属性超出了范围。子类不承担其父类的私有属性,包括变量和函数。
编辑:感谢您澄清您的问题,但这确实让我的答案在这里看起来有点荒谬。 :P
答案 3 :(得分:0)
你可以尝试:
class Foo {
private $id;
public function __set($prop, $val) {
$this->$prop = $val;
}
public function __get($prop) {
return $this->$prop;
}
}
$result = $statement->fetchAll(PDO::FETCH_CLASS, "Foo");
$result[0]->id();