开发者

PHP PDO: Do the fetch styles FETCH_CLASS and FETCH_INTO fetch into private object properties?

Pretty short question, here is an example:

$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);

(written from top of the head, could c开发者_运维技巧ontain syntax errors)

Do those two directly fetch into the private properties of said objects? I read it also circumvents the __construct function, so will it circumvent private status too?


Very short answer: Yes it will.

class Foo
{
    private $id;
    public function echoID()
    {
        echo $this->id;
    }
}
$result = $statement->fetchAll(PDO::FETCH_CLASS, "Foo");
$result[0]->echoID(); // your ID

Aside:

This will cause syntax errors $statement->fetchAll(PDO::FETCH_INTO, $User);. You can't use FETCH_INTO with the fetchAll method.


But event with PDO::FETCH_CLASS there is a problem for private properties for subclasses. 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
*/

But if you set the property to protected - it works fine


The reason you can't access private properties on a super class is because those properties are out of scope. Subclasses don't take on the private attributes of their parent classes, including variables and functions.

edit: Thanks for clarifying your question but it does make my answer look a bit ridiculous here. :p


You could try:

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();
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜