Administrateur PHPfrance |
13231 Messages
02 janv. 2017, 07:04
Tout dépend quel niveau de POO tu veux atteindre, on peux dire oui, ou non ^^
Dans le plus pur esprit
Object, un objet a une seule utilité, ta classe
Member devrait donc juste être une représentation de ton membre, et ne devrait pas contenir la logique SQL.
On remarque ce soucis quand on fait ce qu'on appelle de l'injection de dépendance : ta classe
Member a besoin d'une instance
$db pour fonctionner.
Une classe doit prendre dans le constructeur tout les champs "obligatoires" et proposer des setter pour les autres champs. Ces setter doivent vérifier qu'on ne passe pas n'importe quoi, pour que le but de cette classe est de représenter le membre.
Stocker une date au format jour, mois et année, je te conseille de remplacer par une vrai date, ce qui te permettra des calculs bien plus simple par la suite
Je n'oublierais pas les PHPDoc pour aider les personnes qui lisent ton code (et donc, toi dans le futur), à comprendre ce qui était prévu ici.
Je remplacerais les "private" par des protected pour permettre la surcharge future
Voici un exemple de ce que j'aurais fait de ta classe (je suis parti du postulat que l'id et le username étaient obligatoires) :
<?php
class Member
{
/**
* @var string
*/
protected $id;
/**
* @var string
*/
protected $username;
/**
* @var string
*/
protected $email;
/**
* @var string
*/
protected $surname;
/**
* @var string
*/
protected $name;
/**
* @var string
*/
protected $sex;
/**
* @var Datetime
*/
protected $birthdate;
/**
* @var string
*/
protected $userstart;
/**
* @var Datetime
*/
protected $userdate;
/**
* Allowes values for $sex
* @var array
*/
static protected $allowed_sex = ['M', 'F'];
/**
* Member constructor.
*
* @param string $id
* @param string $username
*
* @return static
*/
public function __construct($id, $username)
{
$this->id = $id;
$this->username = $username;
}
/**
* @return string
*/
public function getId(): string
{
return $this->id;
}
/**
* @param string $id
*/
public function setId(string $id)
{
$this->id = $id;
}
/**
* @return string
*/
public function getUsername(): string
{
return $this->username;
}
/**
* @param string $username
*/
public function setUsername(string $username)
{
$this->username = $username;
}
/**
* @return string
*/
public function getEmail(): string
{
return $this->email;
}
/**
* @param string $email
*/
public function setEmail(string $email)
{
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new \InvalidArgumentException("'$email' is not a valid email adress");
}
$this->email = $email;
}
/**
* @return string
*/
public function getSurname(): string
{
return $this->surname;
}
/**
* @param string $surname
*/
public function setSurname(string $surname)
{
$this->surname = $surname;
}
/**
* @return string
*/
public function getName(): string
{
return $this->name;
}
/**
* @param string $name
*/
public function setName(string $name)
{
$this->name = $name;
}
/**
* @return string
*/
public function getSex(): string
{
return $this->sex;
}
/**
* @param string $sex
*/
public function setSex(string $sex)
{
if( !in_array($sex, static::$allowed_sex) ) {
throw new \InvalidArgumentException("'$sex' is not a valid value (allowed: ".implode(',', static::$allowed_sex).")");
}
$this->sex = $sex;
}
/**
* @return Datetime
*/
public function getBirthdate(): Datetime
{
return $this->birthdate;
}
/**
* @param Datetime $birthdate
*/
public function setBirthdate(Datetime $birthdate)
{
$this->birthdate = $birthdate;
}
/**
* @return string
*/
public function getUserstart(): string
{
return $this->userstart;
}
/**
* @param string $userstart
*/
public function setUserstart(string $userstart)
{
$this->userstart = $userstart;
}
/**
* @return Datetime
*/
public function getUserdate(): Datetime
{
return $this->userdate;
}
/**
* @param Datetime $userdate
*/
public function setUserdate(Datetime $userdate)
{
$this->userdate = $userdate;
}
}
Après, je pense que tu poseras la question "mais où est-ce que je met la requête SQL qui charge cet objet ?" et la réponse est "dans un nouvel objet dont la responsabilité est d'hydrater ton objet
Member et de te le retourner.
Cette classe là ayant pour responsabilité d'aller chercher les données du membre dans la bdd et de retourner un objet Member chargé, il est normal qu'elle ai une dépendance sur PDO (ou autre)
Mais ce que tu tentes de faire est déjà très courant en PHP avec les
ORM (
Doctrine,
Propel)