Alors, pour mieux clarifier les choses, je dirai que tout ce qui concerne un individu (une entité ou une classe) doit être attaché à cet individu comme ses propriétés et méthodes qui définissent ses caractéristiques et ses comportements.
Le cas de la validation du contenu d'une propriété comme le nom d'un client par exemple, relève du comportement de la classe et doit être intégré comme méthode de la classe.
Par contre le cas de la vérification de l'existence d'une occurrence relève du comportement d'une collection. Qui est mieux placé qu'une classe collection d'objets pour vérifier si une occurrence d'un objet existe ou pas dans la collection.
Par exemple, pour le premier car de validation de contenu, on peut parler d'une méthode Setter qui valide l'entrée de données dans les propriétés de la classe. Cela s'écrirait dans le cas d'une classe membre par exemple:
class Membre {
// Propriétés
private $pseudo;
private $motDePasse;
public $validated = null; // sert à cumuler les états de validation des champs
// Méthodes Setter
public function setPseudo($value){
// Règle de validation n°1: obligatoire + caractères autorisés = a-Z/0-9 + >= 8 caractères
if (trim($value)!="" && !preg_match("#[^a-zA-Z0-9]#", $value) && strlen($value)>=8) {
$this->pseudo = $value;
$this->validated!=null ? $this->validated &= true : $this->validated = true; // Cumul de true dans validated utilisant l'opérateur & (ET), sauf pour la première fois (validated=null)
}
else $this->validated = false; // Erreur de la règle n°1
//
return $this->validated;
}
public function setMotDePasse($value){
// Règle de validation n°2: obligatoire + >= 8 caractères
if (trim($value)!="" && strlen($value)>=8) {
$this->motDePasse = $value;
$this->validated!=null ? $this->validated &= true : $this->validated = true; // Cumul de true dans validated utilisant l'opérateur & (ET), sauf pour la première fois (validated=null)
}
else $this->validated = false; // Erreur de la règle n°2
//
return $this->validated;
}
// Méthodes Getter
public function getPseudo() { return $this->pseudo; }
public function getMotDePasse() { return $this->motDePasse; }
} // fin classe
Et pour le second cas de la vérification de l'existence d'une occurence d'objet dans un tas :
class CollectionDeMembres {
// Propriétés
public $contenu = array();
private $deleted = array(); // corbeille
// Méthode d'ajout d'un membre (indexé par clé primaire=pseudo)
public function add($membre) {
if (! $this->exists($membre->getPseudo())) {
if ( $membre->validated == true){
$this->contenu[$membre->getPseudo()] = $membre; // Ajout du membre validé
return true;
}
}
return false;
}
// Méthode de recherche de l'existence d'un membre (accès par clé primaire=pseudo)
public function exists($pseudoMembre) {
if (isset($this->contenu[$pseudoMembre])) return true; // Recherche dans la collection, ...
else
if ($this->getMembreFromDB($pseudoMembre)) return true; // ... puis dans la BD
else return false;
}
// Méthode de mise à jour d'un membre existant (accès par clé primaire non modifiable = pseudo)
public function update($membre) {
if ($this->exists($membre->getPseudo())) {
if ( $membre->validated == true){
$this->contenu[$membre->getPseudo()] = $membre; // Remplacement du membre dans le même emplacement (clé=pseudo)
return true;
}
}
return false;
}
// Méthode de suppression d'un membre existant (accès par clé primaire)
public function delete($pseudoMembre) {
if ($this->exists($pseudoMembre)) {
$this->deleted[$pseudoMembre] = $this->contenu[$pseudoMembre]; // Mise en corbeille
unset($this->contenu[$pseudoMembre]); // Suppression de la liste officielle
return true;
}
else return false;
}
// Méthode de récupération des membres supprimés (se trouvant dans la corbeille)
public function unDelete($pseudoMembre) {
// récupérer Un membre désigné, si n'existe pas déjà
if (! $this->exists($pseudoMembre)) {
$this->contenu[$pseudoMembre] = $this->deleted[$pseudoMembre]; // récup.
unset($this->deleted[$pseudoMembre]); // Suppression de la corbeille
return true;
}
else return false;
}
public function unDeleteAll() {
// récupérer Tous les membres supprimés, si n'existent pas déjà
foreach ($this->deleted as $membre) {
$this->unDelete($membre->getPseudo()); // récup. un par un
}
}
// Constructeur de la collection + remplissage à partir de la BDD
function __construct($getFromDB=true) {
if ($getFromDB == true) {
// ... appel d'une fonction spéciale pour exécuter SQL : SELECT * FROM Membre
// ... et remplir la collection à partir de la table Membre
$this->getAllFromDB();
}
}
// DéConstructeur de la collection + mise à jour de la BDD
function __destruct() {
// ... appel d'une fonction spéciale pour exécuter SQL : Replace Into Membre
// ... et mettre à jour la table Membre à partir de la collection
$this->updateDB();
}
// Méthode de liaison avec la table Membre de la BDD
// Lire les membres à partir de la BD et remplir la collection
public function getAllFromDB($clearCollection=true){
if ($clearCollection == true) $this->contenu = array(); // Nouvelle collection ou non
$sql = "Select pseudo, motDePasse From Membre";
$result = mysql_db_query("test", $sql, mysql_connect("localhost", "root"));
while ($result && $row=mysql_fetch_object($result)){
$membre = new Membre();
if ($membre->setPseudo($row->pseudo) && $membre->setMotDePasse($row->motDePasse) ) $this->add($membre);
}
mysql_close();
}
// Lire un membre à partir de la BD et l'affecter dans la collection (sert aussi comme recherche)
public function getMembreFromDB($pseudoMembre){
$sql = sprintf("Select pseudo, motDePasse From Membe Where pseudo='%s'", $pseudoMembre);
$result = mysql_db_query("test", $sql, mysql_connect("localhost", "root"));
if ($result && $row=mysql_fetch_object($result)){
$membre = new Membre();
if ($membre->setPseudo($row->pseudo) && $membre->setMotDePasse($row->motDePasse) ) return $this->add($membre); // Ajoute le membre dans la collection
}
else return false;
mysql_close();
}
// Mise à jour de la BD à partir de la collection (Ajoute les nouveaux, modifie les anciens et supprime ceux qui sont dans la corbeille)
public function updateDB() {
// On commence par Supprimer les membres mis en corbeille
mysql_connect("localhost", "root");
foreach($this->deleted as $membre){
// Sauvegarde dans la table des membres supprimés avant suppression effective
$sql = sprintf("Replace Into MembreDeleted (date, pseudo, motDePasse) Values ('%s', '%s', '%s')", date("Y-m-d"), $membre->getPseudo(), $membre->getMotDePasse());
$result = mysql_db_query("test", $sql);
// Suppression effective
$sql = sprintf("Delete From Membre Where pseudo='%s'", $membre->getPseudo());
$result = mysql_db_query("test", $sql);
}
// Update et Insert = Replace
foreach($this->contenu as $membre){
$sql = sprintf("Replace Into Membre (pseudo, motDePasse) Values ('%s', '%s')", $membre->getPseudo(), $membre->getMotDePasse());
$result = mysql_db_query("test", $sql);
}
mysql_close();
// Vidage de la corbeille
$this->deleted = array();
}
} // fin classe
Cas d'utilisation:
Validation de saisie d'un formulaire d'inscription de nouveau membre:
$listeMembres = new CollectionDeMembres(); // avec remplissage auto de la BD
$membre = new Membre();
//
if (! $membre->setPseudo($_GET['pseudo'])) $msg = "Le Pseudo est Obligatoire, doit être >= 8 caractères et ne doit contenir que les alphabets et les numériques";
else
if (! $membre->setMotDePasse($_GET['motDePasse'])) $msg = "Le Mot de passe est Obligatoire et doit être >= 8 caractères";
else
// Ajout
if ($listeMembres->add($membre)) $msg = "Bienvenue, vous êtes enregistré";
else $msg = "Désolé, Le pseudo est déjà utilisé";
// Réponse
echo $msg;