Я изучаю pdo в php, чтобы сделать доступ к базе данных более простым и эффективным. Одно объяснение, которое я прочитал для fetch, – это то, что свойства вашего объекта установлены до того, как вызывается конструктор. Что это значит? Любое направление приветствуется.
Это означает, что при использовании PDO для возврата результата в пользовательский объект вам необходимо указать переменные-члены, которые соответствуют ключам результатов запроса.
такие как:
class User { //Predefine Here public $id; public $username; public $password; public $email; public $hash; public function profileLink() { return sprintf('<a href="/profile/%s">%s</a>',$this->id,$this->username); } } $result = $sth->fetchAll(PDO::FETCH_CLASS, "User"); foreach($result as $user) { echo $user->profileLink(); }
Таким образом, PDO может устанавливать переменные для объекта за пределами его внутренней области.
если пользовательский класс выглядит так:
class User { }
то PDO не сможет установить значения извне области, так как не определены свойства.
Скажем, у вас есть этот фрагмент кода
<?php class Foo { public $bar; public function __construct() { $this->bar = 1; } } $stmt = $dbh->prepare("SELECT bar FROM foo"); $stmt->setFetchMode(PDO::FETCH_CLASS, 'Foo'); $stmt->execute(); $obj = $stmt->fetch() ?>
Свойство bar для $ obj будет установлено на «1», а не на то, что вышло из базы данных.
Если вы хотите, чтобы он был установлен на результат из базы данных вместо «1», вы можете изменить режим выборки на
$stmt->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, 'Foo');
Это приводит к вызову конструктора перед назначением результатов свойствам
Оглядываясь на PDO :: FETCH_CLASS, вам не нужно определять переменные как общедоступные, так и частные (с PHP 7.0), вы можете определить пустой класс, а PHP PDO будет заполнять атрибуты как атрибут $ Class->, даже если они не определены.
это очень полезно, потому что вы можете повторно использовать классы с несколькими запросами, которые обрабатывают одну и ту же таблицу, но могут возвращать разные столбцы