Mammouth du PHP |
586 Messages
23 sept. 2022, 19:23
Bonjour,
Il me semble que l'utilisation d'un constructeur dans un trait est plutôt rare car un trait ne peux pas être instancié.
Le constructeur de la classe Connect va écraser le constructeur du trait Connect (ordre de précédence), on pourrait utiliser un alias pour résoudre ce conflit mais il semble plus simple de créer une nouvelle méthode.
Le constructeur ou la méthode de ton trait n'est pas appelé lors qu'il est utilisé par ta classe.
Tu peux appeler cette méthode dans le constructeur de ta classe, via son alias si tu conserves ton constructeur ou via le nom de la nouvelle méthode.
Exemple avec un alias pour éviter le conflit entre les méthodes __construct :
trait Connect
{
private PDO $connc;
public function __construct()
{
try {
$this->connc = new PDO(DATABASE, USER, PASS, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
} catch (PDOException $e) {
echo $e->getMessage();
}
}
}
class Calendar
{
use Connect {
Connect::__construct as __connectConstruct;
}
private string $dte;
private string $hour;
public function __construct(string $dte, string $hour)
{
$this->__connectConstruct();
$this->dte = $dte;
$this->hour = $hour;
}
public function getCalendar(): string
{
return $this->dte .' '.$this->hour;
}
public function exist()
{
$rs_exist = $this->connc->prepare('SELECT * FROM book');
$rs_exist->execute();
}
}
Exemple plus simple avec un autre nom de méthode :
trait Connect
{
private PDO $connc;
public function connexion()
{
try {
$this->connc = new PDO(DATABASE, USER, PASS, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
} catch (PDOException $e) {
echo $e->getMessage();
}
}
}
class Calendar
{
use Connect;
private string $dte;
private string $hour;
public function __construct(string $dte, string $hour)
{
$this->connexion();
$this->dte = $dte;
$this->hour = $hour;
}
public function getCalendar(): string
{
return $this->dte .' '.$this->hour;
}
public function exist()
{
$rs_exist = $this->connc->prepare('SELECT * FROM book');
$rs_exist->execute();
}
}