#php #database #oop #pdo
#php #База данных #ооп #pdo
Вопрос:
Я хочу создать объект сразу после извлечения данных из моей базы данных.
Для этого я использую PDO::FETCH_CLASS и переписанный метод __set(), который я поместил в признак.
Однако я не могу понять, почему у меня появляется сообщение об ошибке: «Фатальная ошибка: неперехваченный ArgumentCountError: слишком мало аргументов для функции Banner::__construct(), передано 0 и ожидается ровно 1 в D:Logicielswamp64wwwprojet-4writer-blogentityBanner.php в строке 34»
Вот мой класс Banner (установщики и получатели опущены) :
<?php
require_once(__DIR__.'Set.php');
/**
* This class represents a banner that will be displayed on the homepage of the FrontEnd
*/
class Banner
{
use Set;
protected $errors=[],
$id,
$displayOrder,
$title,
$caption,
$image,
$buttonTitle,
$buttonLink,
$creationDate,
$modificationDate;
/**
* Constants for errors management during the execution of the methods
*/
const INCORRECT_IMAGE_LINK = 1;
const INCORRECT_TITLE = 2;
const INCORRECT_CAPTION = 3;
/**
* Class constructor which assign values that have been passed in parameters to matching attributes
*
* @param array $donnees The values to allocate
* @return void
*/
public function __construct(array $data)
{
$this->hydrate($data);
}
/**
* Method that allocates specified valued to the matching attributes
*
* @param array $donnees The values to allocate
* @return void
*/
public function hydrate($data)
{
foreach ($data as $key => $value)
{
$method = 'set'.ucfirst($key);
if (method_exists($this, $method))
{
$this->$method($value);
}
}
}
Мой магический метод __set() заключается в следующем Признаке :
<?php
trait Set {
public function __set($property, $value)
{
$explodedProperty = explode("_", $property);
for ($i = 1 ; $i < count($explodedProperty); $i ) {
ucfirst($explodedProperty[$i]);
}
$rightPropertyName = ucfirst(implode($explodedProperty));
if (property_exists(__CLASS__, $rightPropertyName))
{
$this->$rightPropertyName = $value;
}
else
{
throw new Exception('La propriété n'a pas pu se voir assigner une valeur car elle n'existe pas!');
}
}
}
И вот начало моего BannerManager, откуда я извлекаю свои данные :
<?php
require_once("model/Manager.php");
require_once("entity/Banner.php");
class BannerManager extends Manager
{
public function getBanners()
{
$db = $this->dbConnect();
$req = $db->query('SELECT id, title, caption, image, button_title, button_link,
DATE_FORMAT(creation_date, '%d/%m/%Y à %Hh%imin%ss') AS creation_date_fr, DATE_FORMAT(modification_date, '%d/%m/%Y à %Hh%imin%ss') AS modification_date_fr
FROM banners ORDER BY display_order LIMIT 5');
$req->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'Banner');
$banners = $req->fetchAll();
return $banners;
}
Комментарии:
1. потому что ровно 1 аргумент ожидается в
__construct(array $data)
Ответ №1:
Ваш актуальный вопрос здесь заключается в том, как использовать PDO::FETCH_CLASS
с классом, который требует параметров конструктора, поскольку именно об этом говорится в сообщении об ошибке.
И ответом является третий параметр setFetchMode..
$req->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'Banner',[[]]);
должно сработать, предоставив конструктору пустой массив, что позволит вашему коду достичь точки, где __set()
фактически вызывается.