Mes débuts en POO - PHP - Programmation
Marsh Posté le 21-06-2008 à 02:25:24
J'ai aussi du mal avec la POO et vu que je projette de me mettre au C#
Marsh Posté le 21-06-2008 à 03:36:49
Aucun rapport avec la POO:
*pourquoi ne pas choisir dès le départ mysqli ou PDO?
*l'échappement des données sera faite où et comment?
*conclusion des 2 utilises au moins mysqli pour pouvoir utiliser les requêtes préparées quand c'est nécessaire bien entendu
Petit conseil qu'on ne respecte jamais assez en php mais qui a son importance en objet surtout pour php5: bien déclarer tous les membres de ta classe avec la portée que tu veux leurs donner dès le départ. Sinon c'est de la portée publique. Pareil pour les détails pour mes méthodes avec le mot clé final si tu veux pas que ça puisse être redéfini.
En gros faut verrouiller au maxi vu que php permet des largesses.
NE pas oublier toutes les méthodes magiques utilisées à bon escient.
Marsh Posté le 21-06-2008 à 08:21:33
Alors renonce à utiliser la POO. Tous les hébérgeurs n'ont pas PHP5.
Et renonce aussi à faire toi même le script de connexion : Tous les hébérgeurs n'ont pas des machines suffisamment puissantes pour faire tourner une usine à gaz.
Non mais fait quand même arrêter les conneries hein? Pratiquement tous les hébérgeurs (en tous cas ceux serieux) proposent mysqli. En re-écrivant toi même "from scratch" cette lib, tu t'assures de mettre en place un truc immense, super lent et buggé
Marsh Posté le 21-06-2008 à 14:46:36
koskoz a écrit : Je n'utilise ni mysqli et ni PDO car ce n'est pas de base chez tous les hébergeurs, et ce que je suis en train de développer devra tourner chez tous les hébergeurs. |
PDO pas forcement mais mysqli un peu quand meme
Marsh Posté le 21-06-2008 à 15:50:12
Je suis en train de regarder du côté de mysqli.
La première classe que j'aimerai développer est une classe de gestion d'affichage des news.
Donc, mon objet c'est ma news, ça on est d'accord, mais je ne vois pas quoi mettre dans mon constructeur, une requette qui récupère mes news ?
Marsh Posté le 21-06-2008 à 16:35:55
Tu dois résonner ainsi : exemple :
L'article est un objet.
Que peut faire l'article ?
Il peut être créé ( $article = new Article(); ), charger ses attributs de classe en fonction d'un id ( $article->load($id); ), afficher son contenu ( $article->print(); ), ...etc.
Essaye de penser "délégation". Tu dois demander à tes objets de faire le boulot à ta place, tu dois leur donner des ordres ("Charge-toi !", "Affiche-toi !", ...etc.).
Marsh Posté le 21-06-2008 à 17:03:24
Première chose quand on aborde la POO : surtout ne pas commencer par faire des classes de gestion de base de données, c'est le meilleur moyen de se casser la gueule. Les implications sont énormes (connexion persistente, échappement des données, abstraction vis-à-vis du SGBD sous-jacent, configuration, ect.).
Mieux vaut commencer par quelque chose de plus soft.
Marsh Posté le 22-06-2008 à 12:28:03
surtout pourquoi reinventer la roue en voulant coder sa couche bdd :
http://www.phpdoctrine.org
Marsh Posté le 22-06-2008 à 17:10:48
Voici ma class News pour l'instant.
Je ne sais pas du si je suis bien partie, et je ne vois toujours pas quoi mettre dans le constructeur.
Code :
|
Marsh Posté le 22-06-2008 à 17:31:06
Non.
- $mysqli c'est qui? Il est defini nulle part => Faux
- Tu fais un LIMIT 3.$nbr_news => T'es conscient que tu pourras afficher uniquement etre 30 et 39 news?
- Tous les attributs (news_id & co) sont pas déclarés. C'est un sale truc que seul les langages permissifs comme PHP autorisent et qu'il faut pas utiliser. Ca ouvre la porte à plein de salopperies.
- Mettre un constructeur par défaut c'est pas d'une utilité flagrante je trouve .. mais ça je sais que certains le font quand même..
- J'espere que tu fais un contrôle rigoureux ailleurs sur le fait que $nbr_news est bien un entier ... Moi je préfère le faire directement dans la classe..
Marsh Posté le 22-06-2008 à 19:25:13
Pourquoi ya un stripslashes sur les données sorties de la db?
Pourquoi ya tout le bordel concernant les catégories qui est stocké dans une news et pas dans un objet à part?
Idem pour l'auteur de la news?
Et surtout, pourquoi ya tout ce bordel de SQL, alors que ça devrait être dans un DAO/Manager séparé?
(et dans le constructeur, be faut tout ce qui est nécessaire à la création d'une news et qui ne peut être inférré séparément )
Marsh Posté le 22-06-2008 à 19:59:19
La création d'une news en général
oui
http://butunclebob.com/ArticleS.Un [...] iplesOfOod premier lien (SRP - Single Responsibility Principle)
Marsh Posté le 22-06-2008 à 22:33:18
Bon, j'en suis à ça pour l'instant :
Code :
|
Code :
|
Faut-il que j'appelle la fonction "get_news" dans ma classe newsController où ça se fait encore ailleurs ?
Marsh Posté le 23-06-2008 à 13:09:37
ta classe newModel pourrai bien s'appeler news tout court
dans le controleur, tu appelle une vue ( NewsView ) qui prends en paramètre news
et c'est dans la fonction qui fait l'affichage dans newsView que tu appelles News->get_news(10);
Marsh Posté le 23-06-2008 à 15:39:33
Pour ton modèle, que veux-tu qu'il représente ?
Une news ou l'ensemble de tes news ?
Je pense qu'il serait logique qu'un objet news corresponde à une news, avec donc les méthodes :
- constructeur => crée un objet news en prenant en paramètre ses attributs
$n = new News('Titre', $auteur, ...);
ou mieux (à mon avis) :
$n = new News(Array('titre'=>'Titre', 'auteur'=>$auteur)); qui te permet de passer les arguments que tu veux
- save => enregistre la news dans la bdd
- delete => suppriem de la bdd
- accesseurs
Et ensuite des méthodes statiques :
- $n=News::find($id);
- $n=News::find('auteur'=>$auteur); => renvoie un tableau
- News::delete($id);
etc ...
A la limite, va voir http://api.rubyonrails.org/classes [...] /Base.html
C'est pas du PHP, mais ça donne une bonne idée de comment un modèle peut se comporter ...
Marsh Posté le 24-06-2008 à 20:27:36
Avant de coder, tu devrais commencer par acquérir les bases de la poo. Un minimum de connaissances théoriques est nécessaire.
Marsh Posté le 25-06-2008 à 21:37:56
petite question, pourquoi donc NewsModel peu s'apeler News tout court et pas NewsController alors que celu ci possede touts les attribut de la news en question ? (c'est une question a la con mais g beau essayer je galère avec le mvc... =)
Marsh Posté le 25-06-2008 à 21:40:28
personnellement, j'ai tendance a penser que c'est le modèle "news" qui représente le mieux ce qu'ets une news
le contrôleur représente les comportement que peut avoir cette news , et la vue son affichage
Marsh Posté le 29-06-2008 à 22:54:22
Voilà où j'en suis maintenant :
Code :
|
Code :
|
Code :
|
Mon plus gros soucis actuellement : comment faire communiquer les différentes couches du MVC entre elles ?
Pour ma vue par exemple, lorsque l'utilisateur valide le formulaire, c'est sensé arriver sur le contrôleur. Comment dois-je procéder ?
Marsh Posté le 30-06-2008 à 14:20:06
Je comprend pas certains trucs :
- Pourquoi newsController au vue de ses attribut ne s'appelerait pas "news" tout simplement ?
- Pourquoi la class news (que je m'attend à etre une news) permet de gérer les news ? Je l'appelerais plutot newsModel ou newsManager.
- Pourquoi une classe pour la vue ? Wrapper du html dans une méthode d'une classe c'est tout sauf utile. Utilise un moteur de templates avec des templates comme Smarty par exemple. (idéal pour débuter car très documenté)
EDIT : pour répondre à tes questions :
il te faut un frontController qui reçoit toutes les requêtes, qui invoque un Routeur pour les parser puis qui appelle le bon controleur suivant la requête effectuée par réflexion. Exemple sur le net :
http://www.onlamp.com/pub/a/php/20 [...] oller.html
Marsh Posté le 30-06-2008 à 15:24:40
vanadium a écrit : Je comprend pas certains trucs : |
Le NewsController peut (à mon avis, suffi de regarder une structure MVC natif comme Rails) garder ce nom, idem pour News (le modèle). Pour la view, moi j'en ferai un dossier News, contenant un fichier .php par action, comme ça t'évites d'arriver avec un fichier NewsView de 15'000 lignes de xHTML.$
Par contre, dans NewsController, moi je remplacerait news_id par id ... On parle de news, c'est normal que si on dit "id" , c'est l'id d'une news.
Sinon moi j'utiliserais les requètes préparées au lieu de ton système de concaténation. C'est beaucoup plus safe contre les SQL Injections et de plus ça rendrait ton code plus lisible
Marsh Posté le 30-06-2008 à 17:20:59
vanadium => j'ai suivis les conseils donnés précédemment dans ce topic par rapport au MVC.
Pour un système de template, j'y pense, mais je n'y connais encore rien, donc ça me ferait une nouvelle (grosse ?) somme de connaissances à acquérir. Mais voulant faire quelque chose de bien, autant y aller jusqu'au bout.
Je prends ta remarque en compte pour le news_id qui devient id esox_ch.
Pour ce qui est des requêtes préparées, j'en ai toujours entendu parler, mais jamais vu à quoi ça ressemblait, je vais essayer de me documenter.
Marsh Posté le 06-07-2008 à 21:16:36
c'est le controelur qui est la pour faire communiquer le modele et la vue
Marsh Posté le 06-07-2008 à 21:55:11
Je dois utiliser un front controlleur pour faire communiquer mes différentes couches entre elles ?
Parce que j'y comprends rien après lecteur de l'article
Marsh Posté le 06-07-2008 à 22:09:49
koskoz a écrit : Donc le controlleur contient des fonctions de communication ? |
oui , le controleur instancie le modèle avec les bons paramètres et appelle la bonne vue avec ce modele
koskoz a écrit : Je dois utiliser un front controlleur pour faire communiquer mes différentes couches entre elles ? |
exemple , dans mon cas :
un front controleur, qui est instancie le bon module
certains modules ( gestion de document, agenda ) appelent d'autre contrôleur ( page dans la gestion de document , rendez vous dans une agenda) , qui peuvent eux meme continuer à descendre ( un champ d'une page )
Marsh Posté le 07-07-2008 à 12:00:26
Faut bien qu'il y ait un objet dont le rôle est de déterminer quel controleur / méthode il faut executer : ça s'appelle généralement un FrontControleur.
Souvent celui-ci délègue le parsing de l'url à un Routeur pour extraire de l'url le controleur et l'action à executer.
Marsh Posté le 21-06-2008 à 02:20:01
Salut tout le monde,
je suis en train de passer à la POO en PHP, et je dois avouer que j'ai beaucoup de mal.
Je vais donc tenir à jour ce topic avec mes différentes classes et questions en espérant que vous pourrez répondre à ces dernières et m'aider à mieux coder mes classes.
Je commence avec ma classe MySQL :
---------------
Twitter