Objet et Connexion

Résolu
Utilisateur anonyme - 26 avril 2008 à 22:10
 Utilisateur anonyme - 28 avril 2008 à 15:14
Bonsoir,

Je débute en PHP 5 et j'ai des problèmes de compréhension.
Après mes recherches, j'ai crée une classe Connexion et une Classa Annimal.
Pour tester, j'ai créer un formulaire avec 2 champs : Espèce et Couleur.

Je tape Chat et Gris et je fais Valider.

Mon script PHP s'execute :
- Tout d'abbord, il crée un objet Annimal avec un constructeur ayant pour paramètre Chat et Gris. Le constructeur affecte la valeur des 2 paramètres aux propriétés espece et couleur de l'objet. je n'utilise pas de fonction set. Peut-être une erreur.
- Ensuite, mon script appelle la fonction ajouter() de l'objet Animal. Cette fonction crée une connexion avec la base de donnée et execute la requête en utilisant les propriétés espece et couleur.

Je voudrai savoir si tout est correct car je ne trouve pas d'exemple sur Internet.

Merci

11 réponses

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
26 avril 2008 à 22:38
Salut,

Normalement, ce n'est pas à ton objet Animal de se connecter à la base de données.
C'est ta classe d'accès à ton SGBD qui doit s'en occuper. On part souvent du principe qu'une autre classe n'a pas à gérer ça, mais se contente de l'utiliser.

La classe Connexion doit donc se charger d'établir la connexion au serveur de base de données.
Un objet Animal doit donc simplement utiliser la connexion créée. La méthode ajouter() devrait simplement aller chercher la connexion (l'instance de la classe Connexion peut tout à fait être, par exemple, une propriété (privée ou protégée) de Animal) et l'utiliser comme un vulgaire outil.

Personnellement, pour faciliter l'accès à l'instance de la connexion active au serveur de bdd, j'utilise un singleton, que je peux aisément récupérer de n'importe où dans mon code (fonction, objet, n'importe). Singleton => voir les tutos sur les design patterns de Malalam.

Par exemple, ma classe DB possède une méthode statique getInstance() qui retourne une instance de la classe DB : une méthode statique peut être appelée de n'importe où dans le code. Quant au constructeur de la classe DB, sa visibilité est soit "protégé" (le plus souvent) soit "privé" (pas toujours pratique surtout si on veut étendre la classe).

<hr size="2" width="100%" />Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
3
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
26 avril 2008 à 23:21
Un setter permet de contrôler la manière dont une valeur est assignée à une propriété à l'extérieur de la classe : une classe utilisée par d'autres personnes ou par d'autres classes, notamment, et pour des propriétés dont la visibilité est en général protégée ou privée, ou alors dont on souhaite modifier le contenu avant l'assignation (ou le contrôler, etc).
A l'intérieur de la classe, l'utilisation de setters n'est absolument pas indispensable : tu as un accès direct aux propriétés, utiliser des setters est une perte en performances (bon, c'est dérisoire, mais dans ta classe, a priori, tu sais ce que tu fais, donc le setter n'est pas utile).

Exemple de classe (de base, sans fonctionnalité, juste pour illustrer) :

class User {
private $user_id;

public function __construct($user_id) {
$this -> user_id = $user_id;
// Ensuite, va chercher les infos de l'utilisateur dans la bdd
}

public function getUserId() {
return $this -> user_id;
}
}

Dans cette classe rudimentaire, le user_id est déterminé à l'instanciation : on va chercher les informations concernant le membre d'après son user_id.
Par la suite, on ne souhaite pas pouvoir modifier le user_id, mais on souhaite quand même pouvoir le lire. La propriété $user_id est privée : inaccessible ailleurs que dans la classe elle-même. Par contre, la méthode getUserId() permet de lire le user_id.

Imaginons maintenant que l'on souhaite pouvoir modifier l'adresse email du membre, mais empêcher de définir n'importe quelle valeur : il faut que l'adresse soit valide. On va faire de même, mais avec un setter, par exemple setEmail($email)
Cette méthode vérifierait la validité de l'argument $email avant de l'assigner à la propriété de l'objet : elle pourrait retourner TRUE si l'adresse est valide et a été assignée, FALSE sinon. Dans ta classe elle-même, ce ne serait pas utile, sauf si tu souhaites bénéficier du traitement effectué par le setter. Si c'est pour simplement assigner une valeur à une propriété, ce n'est pas indispensable du tout.

Pour revenir à ta question, l'instance de la classe Connexion serait plutôt un argument du constructeur. L'avantage du singleton, c'est de pouvoir récupérer l'instance sans la passer nulle part en argument, et la stocker dans l'objet Animal. N'oublions pas qu'en PHP5 les objets sont passés par référence : ils n'existent donc qu'en un seul exemplaire dans la mémoire de PHP, ce que le développeur manipule ne sont que des références à cet exemplaire unique.
Autrement, passer une instance de Connexion en argument au constructeur de Animal n'a rien de choquant : la propriété désigne quelle connexion l'instance de Animal doit utiliser pour accéder à la base de données.
class Animal {
public $couleur;
public $espece;
protected $connexion;

public function __construct($espece, $couleur, $connexion) {
$this -> espece = $espece;
$this -> couleur = $couleur;
$this -> connexion = $connexion;
}

public function Ajoute() {
$this -> connexion -> query($requete_ajout);
}
}

Si on ne passait pas la connexion en argument, si c'était un singleton, on aurait un constructeur dans ce genre :

    public function __construct($espece, $couleur) {
$this -> espece = $espece;
$this -> couleur = $couleur;
$this -> connexion = Connexion::getInstance();
}

Est-ce que c'est plus clair ?

<hr size="2" width="100%" />Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
3
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
26 avril 2008 à 23:56
Si j'utilise un autre script PHP alors il va créer un objet Connexion
($connexion = new Connexion()) mais comme il existe déjà alors il ne va
pas le créer.

Non. Ce n'est pas comme ça que ça se passe.
Quand le script se termine, toutes les variables (y compris les objets) sont détruites. Toutes, sans exception.
Les connexions aux serveurs de bdd sont fermées (côté script, parce que côté PHP, ce n'est pas forcément le cas pour des connexion persistantes).

Un objet n'existe que pour un script donné. Dans un autre script, il sera à nouveau instancié.

<hr size="2" width="100%" />Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
3
Utilisateur anonyme
26 avril 2008 à 22:53
Merci pour ta réponse.

J'ai vu des classes avec singleton mais pour le moment je vais essayer de faire avec ce que je comprends et par la suite, j'évoluai.

Si je ne fais pas d'erreur, je dois donc dans mon script PHP créer un objet Connexion par exemple "$connex" et le passer en paramètre de ma fonction ajouter() et utiliser dans ma fonction ajouter : $connex->ExecRequete("INSERT ...");

Je ne sais pas si c'est bien çà.

Faut-il toujours utiliser des sets dans un constructeur ou peut-on directement affecter les valeurs aux propriétés ?

Je vais aller voir les tutos pour les singletons.

Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
26 avril 2008 à 23:43
Merci beaucoup de passer du temps à m'expliquer.

Je comprends mieux maintenant. J'aimerai utiliser un singleton mais je pense que c'est un peu compliquer pour moi.

Si je comprends bien, si la classe Connexion est un singleton alors elle sera accessible de partout. D'après ce que j'avais lu, il faut faire un test dans la classe Connexion au cas où la connexion à la bd ait été perdue et si c'est le cas, on la recrée.

Imaginons que j'exécute mon Script PHP, il va alors créer un objet Connexion en singleton. Je pourrai donc y avoir accès de partout. Si j'utilise un autre script PHP alors il va créer un objet Connexion ($connexion = new Connexion()) mais comme il existe déjà alors il ne va pas le créer.

Comment çà se passe alors ? La valeur affectée à $connexion sera à mon avis pas nulle mais je ne vois pas quoi d'autre à moins qu'il ne lui affecte la valeur du singleton déjà existante.

Au niveau de la connexion, est-elle toujours active ou y a-t-il un
destructeur automatique ? En effet, avant en php4, j'utilisai
mysql_close().

Si je passe par une classe singleton, je peux te la montrer pour savoir si je l'ai bien écrite ?

Merci encore.
0
Utilisateur anonyme
27 avril 2008 à 12:11
Je ne vois pas quand est réutilisé le singleton si en fin de script la connexion est fermée. Je n'utilise pas de connexion persistante que les connexions standards.

Peut-être quand on crée une connexion en début de script et que plusieurs objets l'utilise dans le script ?
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
27 avril 2008 à 12:21
Je ne comprends pas ce qui te pose problème...
Peut-être quand on crée une connexion en début de script et que plusieurs objets l'utilise dans le script ?

Ben oui...

Si plusieurs classes utilisent la connexion à la base de données, au
sein de chacune d'elles tu peux appeler le singleton avec un truc dans
le genre : singleton::getInstance()

En développement PHP orienté web, l'environnement d'exécution est limité à celui d'un script, un script ne pouvant pas être exécuté en tâche de fond. Une fois un script terminé, il est déchargé, point barre.

<hr size="2" width="100%" />Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
0
Utilisateur anonyme
27 avril 2008 à 12:39
Ok, donc tous les objets sont détruits en fin de script et si on utilise les sessions, on peut conserver un objet ?

Désolé de te poser autant de question.
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
27 avril 2008 à 12:49
Si on utilise les session, on peut linéariser un objet avec la fonction serialize() (pour le stocker dans une variable de session) puis le récupérer avec unserialize().

Mais bon, la linéarisation d'un objet n'est pas toujours fiable. De plus, une connexion à une base de données ne sera pas préservée pour autant : il faudra utiliser la méthode magique __wakeup() pour reconnecter au serveur de bdd.

<hr size="2" width="100%" />Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
0
Utilisateur anonyme
27 avril 2008 à 13:03
Merci pour tout.

Je vais essayer d'écrire ma classe Connexion avec singleton.
0
Utilisateur anonyme
28 avril 2008 à 15:14
J'essaye d'écrire avec du mal la classe Connexion en utilisant le système Singleton.

J'ai trouvé cette source : http://www.phpcs.com/codes/CLASSE-CONNEXION-BASE-DONNEE-MYSQL_42561.aspx

Je ne sais pas si je peux m'en inspirer. Reflète t-elle bien la philosophie Singleton ?
Doit-on obligatoirement ne pas utiliser le constructeur comme indiqué ?

L'utilisation des setters dans le constructeur n'est pas utile puisqu'on est dans la classe non ?
A quoi sert la fonction _destruct() puisque la destruction se fait en fin de script ?

Merci
0
Rejoignez-nous