PHP PDO для создания объекта класса с fetchObject - PullRequest
0 голосов
/ 10 марта 2019

Я пытаюсь создать объект "Пользователь" внутри своего класса "Пользователь" на основе свойств, которые я сохранил в своей базе данных, к которым я использую PDO.

Я ищу некоторые страницыв Google и обнаружил, что большинство людей для этого используют метод fetchObject.Сейчас я пытаюсь использовать это для создания объекта текущего класса, но получаю сообщение об ошибке:

Неустранимая ошибка: Uncaught ArgumentCountError: Слишком мало аргументов для функции User :: __ construct (), 0 прошло и ровно 11 ожидается в ...

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

Мой текущий код такой:

public static function createUserBySQL($id)
    {
        $stmt = BD::getConnection()->prepare("SELECT * FROM user WHERE username = ?");
        $stmt->execute([$id]);
        $user = $stmt->fetchObject(__CLASS__);
        var_dump($user);
        return $user;
    }

Это может быть легко решить, но я впервые делаю ООП в PHP с PDO, поэтому я пока не знаю всех советов и подсказокчтобы обойти это легко;)

Спасибо,
mikeysantana

БЫСТРОЕ РЕДАКТИРОВАНИЕ: Все атрибуты из экземпляра "User" являются частными, и я хотел сохранить его таким, чтобы поддерживать кодлогика.

Ответы [ 2 ]

1 голос
/ 10 марта 2019

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

Когда объект извлекается, его свойства назначаются из соответствующих значений столбца, а затем вызывается его конструктор.

Когда вызывается конструктор, аргументы не передаются, поэтому вы получаете эту ошибку.

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

0 голосов
/ 10 марта 2019

Спасибо всем за помощь.

Чтобы помочь будущим читателям этого вопроса, вот мое решение:

Я сохранил вышеописанный метод «createUserBySQL», я только изменил свой конструктор.

Конструктор теперь имеет все свои атрибуты в необязательной подписи, например:

function __construct($name = null, $surname = null ...)

Внутри конструктора я сделал проверку, чтобы убедиться, что все аргументы были нулевыми. Поскольку у меня их было 11, выполнение оператора if для всех было бы довольно раздражающим, поэтому я использовал метод func_get_args (), который возвращает массив со всеми аргументами, переданными в конструктор.

Конечный конструктор будет выглядеть примерно так:

function __construct($firstname = null, $surname = null, ...)
    {
        if (func_get_args() != null){
            $this->firstname = $firstname;
            $this->surname = $surname;
            ...
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...