|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||
|
Invité régulier
![]() Inscription : janvier 2010 Messages : 32 ![]() |
Bonjour à tous et à toutes ^^
je suis en train de développer un petit Framework pour améliorer mes connaissances dans l'utilisation de la POO en PHP. Je me trouve face à une interrogation sur la visibilité de certaines propriétés de mon objet. Disons que j'ai une table "Articles" avec comme champs ID - TITRE - MESSAGE. Lors de l'implémentation vous me conseillez quoi comme : ? Code :
Code :
Code :
La question principale concerne principalement les deux dernières façon car la 1er revient au même que la 2eme mais en mieux. Qu'en pensez vous ? merci d'avance |
||||||
|
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() ![]() |
Bonjour,
D'expérience, j'opterai pour la deuxième méthode mais en la complétant. Je définirai un tableau de mot-clés acceptés par la fonction set_var(). Ensuite en commentaire des fonctions tu mets la liste des mots-clés disponibles. Les systèmes très rigides avec des accesseurs et mutateurs pour chaque attribut ne tiennent pas longtemps quand il s'agit de manipuler des données aussi volatiles. Cela alourdit sévèrement toute modification ultérieure. Réserve les set et get que pour les classes de base de ton framework (les fondations) et privilégie la paire (mot-clé, valeur) pour tout le reste. Cette approche t'oblige à vérifier les mots-clés et à bien commenter toutes tes fonctions pour t'y retrouver mais quelle souplesse en contrepartie. En plus, pour ne rien gâcher, tu peux très bien factoriser le code traitant cette partie dans une classe abstraite qui ne gère que ça et du coup tu pourras rendre privé ton tableau de valeurs.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile... |
|
20
|
|
|
#3 | ||||||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Une autre façon d'utiliser la deuxième forme:
Code :
Je te rappelle également que les accesseurs (getters/setters) peuvent prendre la forme de méthodes magiques __get et __set qui permettent d'utiliser naturellement des indexs d'un tableau associatif (propriété de la classe) de la même façon que s'il s'agissait de propriétés: Code :
Code :
Note: Database est une façade statique de PDO.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
||||||
|
20
|
|
|
#4 | ||||||
|
Invité régulier
![]() Inscription : janvier 2010 Messages : 32 ![]() |
Bonjour,
merci pour la réponse rapide, ca confirme ma pensée Citation:
Code :
Citation:
EDIT : Oupss, je n'avais pas vu la 2eme réponse ^^ Je ne connaissais pas ArrayObject, je vais regarder de plus prés. Sinon normalement ma classe Article extend ma classe ModelCore, qui fait ce que t'a classe model fait mais en bcp moins générale ^^ Concernant ce code ci : Code :
Avec un in_array sur le tableau de mot clé (comme expliqué par rawsrc), ca permet de n'avoir dedans que des données connues. |
||||||
|
|
00
|
|
|
#5 | ||||||||
|
Invité régulier
![]() Inscription : janvier 2010 Messages : 32 ![]() |
Désolé pour le double post ^^
Je repense à votre méthode avec les get et set magique ^^ Comment l'utiliseriez vous sur un model avec des données multilingue ? Vous créeriez un deuxième tableau comme ceci : Code :
$var_trad = array ('fr' => array ('name' => 'test')); EDIT : j'ai implémenté les set et get magique comme suit : Code :
Code :
Code :
Code :
Merci pour l'aide apporté |
||||||||
|
|
00
|
|
|
#6 | |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Je pense personnellement que l'internationalisation n'a rien à voir avec le modèle à moins que ce dernier ne soit lui-même multilingue.
Citation:
Tu peux regarder la classe Lang d'Axiom pour avoir des idées (voir ma signature).
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|
|
10
|
|
|
#7 |
|
Invité régulier
![]() Inscription : janvier 2010 Messages : 32 ![]() |
Par modèle, tu parle bien de ma classe article dans ce cas ci ?
En base de données, il est structuré comme suit (simplifié) : [Articles] --> id [Articles_lang] -> language_fk, articles_fk, content EDIT : Je vais aller y jeter un coup d'oeil ^^ Petite question : pourquoi utilise tu des fichiers .ini pour les lang ? Pour ma part, pour les traductions "non dynamique", je pensais partir sur des tableaux de lang stocké dans la superglobale $GLOBALS. C'est une mauvaise idée selon toi ? |
|
|
00
|
|
|
#8 | ||||||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Citation:
Citation:
Le moteur que j'ai fait permet tout bêtement de remplacer du texte dans les traductions. Exemple: fichier en.ini Code :
Code :
Code :
<p>bla bla bla <?=i18n('foo.bar', 'peter')?> Pour ce qui est du multilinguisme au niveau du modèle (Article est un bon exemple), je gère plusieurs couples title/body par Article dans des tables MyISAM avec des clés fulltext pour la recherche. Donc un même article peut être rédigé en plusieurs langues et une méthode de la classe Article permet de choisir laquelle afficher.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
||||||
|
10
|
|
|
#9 | |||
|
Expert Confirmé
![]() ![]() |
Citation:
Généralement tout mélanger dans une super classe pour économiser je ne sais quoi est une très mauvaise idée et se termine souvent dans une impasse. Voici le code en accord avec mon message : Code :
__________________
# Dans la Création, tout est permis mais tout n'est pas utile... |
|||
|
00
|
|
|
#10 | ||
|
Invité régulier
![]() Inscription : janvier 2010 Messages : 32 ![]() |
Merci pour vos conseils ;-)
Mais on est bien d'accord, que cette remarque : Citation:
Ne s'applique pas lorsqu'il s'agit de l’internationalisation de l'objet lui même ? Car le modèle "représente" mon article et ce qui le compose donc ses champs multilingues doivent aussi être disponible d'une manière ou d'une autre ? |
||
|
|
00
|
|
|
#11 |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Tout à fait, arrange-toi pour pouvoir distinguer les différentes langues d'un même article et le tour est joué (cf mon post plus haut).
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|
00
|
|
|
#12 |
|
Invité régulier
![]() Inscription : janvier 2010 Messages : 32 ![]() |
Oui
Merci pour la confirmation |
|
|
00
|
|
|
#13 |
|
Membre expérimenté
![]() ![]() Inscription : mars 2005 Messages : 648 ![]() |
C'est drôle que tout le monde semble avoir opté pour la seconde solution, moi je serais allé vers la première.
D'une part parce que tu peux contrôler de facon plus granulaire l'accès à chaque données. Par exemple empêcher la mise à jour du prix sans d'abord passer par une méthode de validation et de conversion. Ensuite tes objets ont en quelque sorte aucun attribut. Impossible de faire appel à la réflection, de documenter efficacement tes classes (avec phpDocumentor ou un truc du genre), il sera difficile de migrer vers des solutions comme des ORM, ou si jamais tu migre, de laisser d'éventuel frameworks analyser les données de tes classes. Et finalement, tu risque de te retrouver à "prostituer" des objets. Je veux dire par là que tu sera dans une situation particulière, et te dira "bof, je vais lui injecter une variable bidon, ca m'évitera de .....". Bref, une porte ouverte à la tentation des mauvaises pratiques. Je ne suis pas 100% contre la seconde solution, mais je pense qu'il faut vraiment pouvoir justifier la nécessité d'utiliser cette forme de classe. |
|
|
00
|
|
|
#14 | |||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Citation:
Si ça te gène à ce point qu'un même accesseur accède indifféremment à n'importe quelle propriété, tu peux utiliser cette forme: Code :
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|||
|
00
|
Copyright © 2000-2012 - www.developpez.com