Установка объекта, возвращаемого из PDO в своем собственном классе - PullRequest
1 голос
/ 26 февраля 2012

У меня есть класс с именем Admin, и он имеет те же поля, что и поля в моей таблице admins в базе данных: id, email, pwhash, pwnonce, name, permissions.

Мой класс выглядит так (упрощенно):

class Admin {
    var $id, $email, $pwhash, $pwnonce, $name, $permissions;

    function auth() {
        // checks the session and attempts to authenticate the user
    }

    function login($email,$pw) {
        // authenticate the user and start a session for them.
    }
}

Проблема в том, что я хочу использовать PDO для извлечения объекта с использованием текущего класса и присвоения его текущему объекту.

Раньше я выбирал ассоциативный массив и присваивал все переменные по одной, но теперь, поскольку я изменяю свою систему на использование PDO, я хочу, чтобы он возвращал экземпляр Admin класс, который я назначаю текущему.

Например, в методе auth() должно быть что-то вроде этого:

function auth() {
     if (!isset($_SESSION['id'])) return false;
     $id = $_SESSION['id'];

     // create PDO connection and assign to $dbh

     $sth = $dbh->prepare('SELECT * FROM admins WHERE id = ?');
     $sth->execute(array($id));
     $sth->setFetchMode(PDO::FETCH_CLASS,get_class($this));
     $obj = $sth->fetch();
     if (!is_object($obj)) return false;

     $this = $obj; // I know this won't work, but anyway...
}

Итак, я попробовал это, и, как я и подозревал, это не позволит мне присвоить значение $this. Однако я все еще хочу использовать функциональность сопоставления объектов PDO, так как я могу назначить объект, возвращенный из PDO, экземпляру, в котором я нахожусь?

Ответы [ 4 ]

4 голосов
/ 26 февраля 2012

Если вы хотите получить новый объект данного класса, вы используете PDO::FETCH_CLASS.Однако, если вы хотите записать значения свойств в существующий объект , который у вас уже есть, вы используете PDO::FETCH_INTO, например, так:

 $sth->setFetchMode(PDO::FETCH_INTO, $this);
 $sth->execute();
 $sth->fetch();

Обратите внимание, что свойства, в которые вы хотите записатьдолжен быть общедоступным, либо напрямую, либо с помощью магического метода __set().

Однако вам следует внимательно рассмотреть ответ @ Truth.Нехорошо проектировать, чтобы один и тот же класс (а тем более один и тот же объект !) Отвечал как за доступ к базе данных, так и за представление записи.Один класс отвечает за управление записями авторизации, а другой - за сами записи.

1 голос
/ 26 февраля 2012

Вместо того, чтобы пытаться переопределить $this, верните рассматриваемый объект:

return $obj;

Затем используйте его следующим образом:

$admin = $admin->auth();

Что бы переопределить текущий объект администратора.


Хотя лучшим подходом было бы присвоение переменных текущему объекту или использование класса абстракции, было бы более разумно.

Попробуйте сказать, что выделать вслух.Вы говорите от Admin до auth(), а затем заменяете себя новым Admin, который аутентифицирован.Скорее, вы должны AdminManager обработать запрос на аутентификацию и вернуть объект Admin, или иметь саму аутентификацию Admin, а затем заполнить детали в этом же объекте.

ДругоеКроме того, в вашем приложении вы предотвращаете дублирование и утечки памяти.

0 голосов
/ 26 февраля 2012

Вы можете использовать перегрузку для перенаправления каждого вызова в объект вашей базы данных.

class Admin {
  function auth() {
    // [...]

    $this->pdo_obj = $obj;
  }

  function __get($attribute) {
    return $this->pdo_obj->$attribute;
  }

  // Implement __set, __isset, ... here
}
0 голосов
/ 26 февраля 2012

Переменной, которую вы назвали $ obj, присваивается ассоциативный массив, который возвращает fetch (). Каждый элемент в этом массиве имеет ключ, который является именем столбца таблицы, и значение, которое является значением для этой строки и столбца. Поскольку в вашем классе есть переменные экземпляра, которые соответствуют им, вы можете просто установить их с помощью:

$this->id = $obj['id'];
$this->email = $obj['email'];

... и т. Д. Для каждого.

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