PHP PDO:获取样式FETCH_CLASS和FETCH_INTO获取私有对象属性吗?

时间:2011-09-02 11:48:14

标签: php database pdo

很简短的问题,这是一个例子:

$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函数,它也会绕过私有状态吗?

4 个答案:

答案 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_INTOfetchAll方法一起使用。

答案 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();