PHP PDO: Стили выборки FETCH_CLASS и FETCH_INTO извлекают свойства частного объекта? - PullRequest
7 голосов
/ 02 сентября 2011

Довольно короткий вопрос, вот пример:

$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 ]

7 голосов
/ 02 сентября 2011

Очень короткий ответ: Да, будет.

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 голос

Но для события с PDO :: FETCH_CLASS существует проблема с закрытыми свойствами для подклассов. Э.Г.

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
*/

Но если вы установите свойство protected - оно будет работать нормально

0 голосов
/ 23 февраля 2016

Вы можете попробовать:

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 голосов
/ 01 августа 2014

Причина, по которой вы не можете получить доступ к закрытым свойствам суперкласса, заключается в том, что эти свойства находятся вне области видимости. Подклассы не принимают частные атрибуты своих родительских классов, включая переменные и функции.

edit: Спасибо за разъяснение вашего вопроса, но это делает мой ответ немного смешным. : Р

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...