begin process at 2010 03 21 21:28:36
  Trouver un code source :
 
dans
 
Accueil > Forum > 

PHP

 > 

POO

 > 

Classes & Objets

 > 

Objet et Connexion


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Objet et Connexion

samedi 26 avril 2008 à 22:10:14 | Objet et Connexion

Profite

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





samedi 26 avril 2008 à 22:38:32 | Re : Objet et Connexion

neigedhiver

Réponse acceptée !
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).


Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
samedi 26 avril 2008 à 22:53:30 | Re : Objet et Connexion

Profite

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

samedi 26 avril 2008 à 23:21:52 | Re : Objet et Connexion

neigedhiver

Réponse acceptée !
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 ?


Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
samedi 26 avril 2008 à 23:43:53 | Re : Objet et Connexion

Profite

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.

samedi 26 avril 2008 à 23:56:37 | Re : Objet et Connexion

neigedhiver

Réponse acceptée !
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é.


Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
dimanche 27 avril 2008 à 12:11:10 | Re : Objet et Connexion

Profite

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 ?
dimanche 27 avril 2008 à 12:21:03 | Re : Objet et Connexion

neigedhiver

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.


Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
dimanche 27 avril 2008 à 12:39:28 | Re : Objet et Connexion

Profite

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.
dimanche 27 avril 2008 à 12:49:45 | Re : Objet et Connexion

neigedhiver

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.


Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...

1 2

Cette discussion est classée dans : fonction, couleur, objet, connexion, crée


Répondre à ce message

Sujets en rapport avec ce message

pb avec la poo5 [ par windu ] Voila mon problème:Je crée un objet qui manipule (entre autres) des tableaux.... jusque là tout va bien!La où je coince, c'est que cet objet est appel appel et récupération du résultat de la fonction [ par gwady ] Bonjour,Je voudrais savoir si ce que je fais est correte car ma page est vide. J'ai un 4 fichier dont deux qui me permettent de faire ma connexion à m détruire un objet [ par eax ] salutj'ai une question toute conne :pcomment on fait pour détruire un objet crée avec un truc du genre $blabla=new machin();pk je crée un objet pr cha pb avec ma classe [ par windu ] voila, j'utilise 1 classe de connexion (MySQL), classe que j'appelle dasn mon fichier de connexion à la base. tout va bien il me suffit d'inclure ce f A l'aide (assez urgent !!) [ par slhuilli ] bonjour,je suis a la recherche d'une fonction (php4, pas de php5 objet) ou systeme permettant (comme le permet une fonction) d'ajouter rapidement dans Éxécuter une fonction dans X minutes même si connexion inactive [ par Florynth ] Bonjour,je veux qu'un fonction soit éxécuté X minutes après l'appel d'une page mêmes si la session/connection est inactive... En fait justement si la objet php5 surdéfinition de fonctions [ par poiuytrez3 ] Bonjour, j'ai crée un objet php5 avec plusieurs membres privés. J'ai donc crée une fonction function __get($attribut){ return $this->attribut; } e Comment avoir acces a ma classe connexion depuis un autre objet? [ par fabienenvac ] Bonjour,Je viens encore ici pour vous demander de l'aide.J'ai creer un objet pdo afin de me connecter à ma bdd, jusqu'ici ca va!Maintenant, je souhait Appel d'un fonction à telle date [ par picolo220 ] Bonjour, je suis actuellement en train de coder une sorte de site de vente aux enchères, mais je me heurte au problème suivant.Comment changer automat Petit problème de fonction. [ par sbool ] Bonjour :)Je n'arrive à rien dans mon code, est-ce normal car c'est impossible ou est-ce que je déconne?Je cherche en fait à dessiner un carré dans un


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,343 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales