Допустим, у меня есть такой класс:
Class User {
var $id
var $name;
}
И я запускаю запрос с использованием PDO в php следующим образом:
$stm = $db->prepare('select * from users where id = :id');
$r = $stm->execute(array(':id' => $id));
$user = $r->fetchObject('User');
Если я изменяю свой пользовательский объект, в нем есть все другие поля, которые я не определил в классе User. Очевидно, что я мог бы сделать свой запрос конкретным, чтобы он возвращал мне только те поля, которые мне нужны / нужны. Но если я не хочу этого делать, есть ли способ заставить эту работу работать так, как я хочу?
Мне нравится идея fetchObject, потому что это одна строка кода для создания этого объекта и установки переменных-членов для меня. Я просто не хочу, чтобы он устанавливал переменные, которые я не определил в своем классе.
EDIT:
Ну, кажется, что karim79 прав, и fetch или fetchObject не будут работать так, как я хочу. Я добавил следующий фрагмент кода после выполнения выборки, чтобы получить желаемые результаты.
$valid_vars = get_class_vars('User');
foreach (get_object_vars($user) as $key => $value) {
if (!array_key_exists($key, $valid_vars)) {
unset($user->$key);
}
}
Очевидно, что это не самое элегантное решение: / Я собираюсь расширить класс PDOStatement и добавить свой собственный метод fetchIntoObject или что-то в этом роде и автоматически делать эти сбросы. Надеюсь, не должно быть слишком много накладных расходов, но я хочу иметь возможность легко извлечь объект с 1 строкой кода:)
СУПЕР РЕДАКТИРОВАНИЕ:
Благодаря комментарию Мамаара я снова вернулся к документации. Я нашел в чем проблема. http://us.php.net/manual/en/pdo.constants.php и прокрутите вниз до PDO :: FETCH_CLASS, и это объясняет, что магический метод __set () используется, если свойства не существуют в классе. Я переписал метод в моем целевом классе и тада, работает. Опять же, не самое элегантное решение. Но теперь я понимаю ПОЧЕМУ, и это важно для меня: D