Довольно короткий вопрос, вот пример:
$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
, так же как и обойти частный статус?
Очень короткий ответ: Да, так и будет.
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
.
Но событие с 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 */
Но если вы установите свойство для защиты – оно отлично работает
Причина, по которой вы не можете получить доступ к приватным свойствам суперкласса, заключается в том, что эти свойства недоступны. Подклассы не принимают частные атрибуты своих родительских классов, включая переменные и функции.
edit: Спасибо за разъяснение вашего вопроса, но это делает мой ответ немного смешным здесь. :п
Вы можете попробовать:
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();