PHP5 - CLASSE DE NEWS ET DE COMMENTAIRES

audayls Messages postés 373 Date d'inscription samedi 9 juillet 2005 Statut Membre Dernière intervention 11 août 2008 - 6 août 2006 à 23:32
tefa24600 Messages postés 30 Date d'inscription samedi 4 août 2007 Statut Membre Dernière intervention 21 février 2012 - 21 févr. 2012 à 11:07
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/38960-php5-classe-de-news-et-de-commentaires

tefa24600 Messages postés 30 Date d'inscription samedi 4 août 2007 Statut Membre Dernière intervention 21 février 2012
21 févr. 2012 à 11:07
Bonjour FhX, merci pour avoir partager ce code, notamment en ce qui concerne la "bonne" programmation de la POO, comme l'exploitation d'une interface pour les développeurs qui utiliseront cette source.
Mais (car il y a un mais), mettre ce code en initié alors qu'il n'en est rien (la mise en place des design pattern requiert quand même un minimum d'expérience) et proposer ce code sans commentaire, sans source SQL et sans la classe de connexion est idiot..

Voilà pourquoi je mets une note si basse, qui reste au-dessus de la moyenne car ce code vaut plus je l'accorde.
acidline Messages postés 21 Date d'inscription vendredi 9 décembre 2005 Statut Membre Dernière intervention 21 juillet 2008 1
18 juil. 2008 à 10:33
pour info, CodeFalse et moi même (enfin surtout moi !) bataillons sur l'adaptation de la source de FhX pour une utilisation perso !

Rendez-vous ici
acidline Messages postés 21 Date d'inscription vendredi 9 décembre 2005 Statut Membre Dernière intervention 21 juillet 2008 1
16 juil. 2008 à 15:36
Bonjour à tous,

Super le code, enfin quelque chose de concret sur l'architecture web avec PHP. Cependant, je pense qu'il y des gens comme moi qui souffre un petit peu par manque de connaissance (ou d'entrainement !). C'est possible d'avoir des exemples d'utilisation ...

Ok pour l'exemple d'affichage d'une news mais comment tu gères ça quand il y en a plusieurs, il faut utiliser la méthode GetMultipleNews(x,y) mais comment tu récupères le résultat, quand je teste je récupère qu'une news à la fois.

Ensuite comment fonctionne les méthode d'ajout et de modif. Il faut que le tableau que l'on transmet aux méthode soit du type NewsObject ?!

Bref, la class est magnifique et j'ai eu beaucoup de mal à la comprendre, mais c'est vraiment énorme de pouvoir progresser grâce à des personnes comme toi.

Mais s'il te plait, encore un chti effort pour des exemples !!!

Nico
ryohazuki Messages postés 2 Date d'inscription samedi 6 janvier 2007 Statut Membre Dernière intervention 22 janvier 2007
22 janv. 2007 à 13:11
salut je suis en train de creer mon site et je suis tres besoin des commentaires .le probleme c"est quand j'esai d'instaler un script je fini par l'echoue.
et maintenan je veux un membre de ce site qui l'installe a ma place.
-mon hebergeure est lycos (multimania.lycos.fr)
-mon psuedo est : taha_ryo_hazuki
-mon mot de passe est: shenmue200
MERCI !!!!!!!!!!!!!
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
21 août 2006 à 14:11
Si j'utilise l'opérateur de typage, c'est parce que je veux être sur du type de ma variable :)

Je l'utilise surtout lors d'un fetch_array(), parce que fetch_array() renvoit toujours un tableau avec de "string" même si les champs sont en INT.

Je force aussi certaines variables à être en INT car comme ca, je suis paré à tout, surtout lors de mes appels à la base de donnée.

Imagine que je fasse ca pour une query :
SELECT xx,yy FROM tt WHERE x = $x;
Mon champ x est en INT(11).
Si $x est un entier, aucun problème.
Si $x est un string alors tu vas te taper une erreur SQL.

Voila pourquoi je force dans mes méthodes. Comme ca, je n'ai aucun problème par la suite.

Le but d'une classe est de pouvoir utiliser les méthodes sans avoir à faire un quelconque test puisque tout doit se faire dans ma classe.
Un peu comme une API, tu lui passes des trucs en paramètres et ca fait mumuse tout seul :)


Pour mes retours de fonctions, j'évite au grand maximum de faire du "mixed return". J'utilise les exceptions via PHP5 au lieu de générer un FALSE :)
Beaucoup plus facile à utiliser d'ailleurs :

try {
$retour = $objet->method($params);
echo $retour;
} catch ( Exception $e ) {
die ($e->getMessage());
}

Si $objet->method retourne une exception, je saute directement au catch.
Sachant que tu peux imbriquer les try{}catch{}, la prog devient plus facile à lire tout à coup plutot que de faire 40 instructions en une ligne :p

Voila voila
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
15 août 2006 à 20:37
Allez ces Messieurs, on se calme un peu...
guill76 Messages postés 193 Date d'inscription mercredi 24 août 2005 Statut Membre Dernière intervention 3 juin 2016
15 août 2006 à 20:18
Il me semble que c'est pas le lieu ici pour faire ce genre de remarque, Ok t'es peut - être un admin de cs mais bon ça ne te dispense pas d'être pertinent dans tes remarques.
Mon post était juste ici pour livrer une réflexion, je suis encore en train d'apprendre le PHP mais je ne me sens en aucun cas, étaler une "ignorance crasse". Peut être que je n'aurais jamais posté cette reflexion si je l'avais eue à un autre moment (qu'à 2 heure du mat hier, c'est vrai).Mais bon je vois pas en quoi j'ai traîté FHX d'ignorant dans ma tournure de phrases (si tu y vois une attaque c'est ton problème et de toute façon ce n'est pas à toi d'intervenir à sa place)
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 août 2006 à 19:40
Il y a des tournures qui sont surtout une occasion d'étaler une ignorance crasse. Au lieu de t'y complaire tu aurais pu par exemple passer cela sur l'heure tardive ou que sais-je encore.
Tout le monde peut apprendre s'il le veut et de nimporte qui, tout est affaire de choix.

Je t'ai parlé tout à fait courtoisement, tu seras donc prié de faire de même.
Les règles du savoir vivre s'appliquent sur CS, si elles ne te conviennent pas, suffit de me le dire et ton compte ainsi que tes contributions seront enlevées illico.
guill76 Messages postés 193 Date d'inscription mercredi 24 août 2005 Statut Membre Dernière intervention 3 juin 2016
15 août 2006 à 15:46
BrunNews : je te cause ? , et d'ailleurs il me semble que ma tournure est une forme de respect.
Je ne sais pas qui tu es, mais permets-moi de te dire que, par ta remarque, tu rernifles le faux jeton à 100 m: Je n'ai aucune leçons de Français à recevoir de quiconque et encore moins de toi. Alors bonnne continuation, (à jamais, t'inquiètes pas!, je l'espère aussi.)
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 août 2006 à 10:03
GUILL76 >
Il faut éviter les tournures à rallonge qui n'apportent rien d'autre que des erreurs:
"... tu n'es pas sans ignorer ..."
Ton interlocuteur se voit donc traité d'ignorant alors que:
"tu sais certainement" supprimait toute ambiguïté.
Bonne continuation.
guill76 Messages postés 193 Date d'inscription mercredi 24 août 2005 Statut Membre Dernière intervention 3 juin 2016
15 août 2006 à 02:14
Salut,
En voyant ce code il m'est venu une interrogation dont je vous fais part (et c'est en exclusivité sur code sources :) ):

FHX: J'ai remarqué que tu utilisais souvent(int)devant la fonction pour effectuer une conversion de type (tu as certainement raison au niveau syntaxique et portabilité du code). Mais tu n'es pas sans ignorer que php autorise dans une fonction un retour sur plusieurs types.
Exemple la fonction fopen peut retourner l'identifiant en cas de succès ou false an cas d'echec.
Que penses d'une astuce(que j'ai découverte, mais que d'autres utilisent surement) qui consiste à ajouter 0 au retour d'une fonction?
Exemple:
J'ai une fonction qui retourne des nombres(entiers ou flottants) lus dans un fichiers donc au format string, si la fonction echoue elle renvoie false.
Avec l'astuce en question je peux faire ce contrôle qui sera toujours fiable :
du coup ici je peux effectuer [evluation+transtypage+affectation+controle] en une ligne(4 instructions ):

if (false!==($valeur=fonction('bidule')+0)) =>(car false + 0 === false)

or, avec ce contrôle (4 instructions aussi)
if (false!==($valeur=(int)fonction('bidule'))) //toujours vrai

si j'utilise cette conversion qui semble plus rigoureuse , la dernièe condition sera toujours vraie, donc le contrôle ne sera plus jamais fiable, ou alors il faut rajouter une instruction supplémentaire:

if(false!==($retour = fonction('bidule'))
$valeur = (int)$retour;
donc, du coup, 5 instructions au lieu de 4;

Dans ce cas autant opter pour l'astuce (+0), non?
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
10 août 2006 à 02:33
if ( !isset(self::$instance) ) <== et pas empty() :p
Car dans ta déclaration en début de classe :
static private $instance = NULL;
et pas : static private $instance = '';

:)

Tu as parfaitement compris comment ca marche :) Cette technique s'appele le Singleton.
Très efficace pour une instance unique et globale d'un objet =)
cs_Garno Messages postés 36 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 14 janvier 2009
10 août 2006 à 01:18
Mouais ... encore une fois j'ai parlé trop vite :) en m'y remettant un peu j'y suis parvenu. En fait ce n'est pas très complexe. Voici ce que sa donne :

static public function getInstance()
{
if(empty(self::$instance))
self::$instance = new self();

return self::$instance;
}
cs_Garno Messages postés 36 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 14 janvier 2009
10 août 2006 à 01:01
Salut,

J'ai regarder de plus près ton code et sa confirme ce que je disais .. c'est une très bonne source. De plus, j'ai remarquer que tu récupérais ton object mysql via une fonction MySQL::getInstance(). Voilà quelques temps que j'essai de faire quelque chose du genre afin de pouvoir utiliser ma classe de base de données un peu partout à travers mes classes et je n'y arrive absolument pas. Est-ce qu'il serait possible d'avoir le code exacte de cette fonction ?? :)))

Merci d'avance
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
8 août 2006 à 13:19
En effet, je n'ai pas mis les tables SQL.
Chacun peut avoir sa structure de table. Je pars dans le principe que celui qui utilise une classe sait comment fonctionne SQL. Et de plus, il n'y a que les requètes à modifier et le noms des méthodes est suffisament évocateur pour ne pas se tromper :)

Ma classe de DB est sur le site de PHPCS. De toute facon, classe ou pas classe, celle ci est suffisament compréhensible pour tout le monde. Le nom des méthodes est la même que pour les fonctions style mysql_query(), mysql_fetch_array() bref... je pense être compréhensible la dessus.

Concernant l'interface, en effet y'a aucun intérêt ici. Je l'ai mis pour bien faire voir qu'une interface sert de pont entre le dev et la classe. Je pourrais faire une autre classe qui hérite de Factory mais au lieu de chercher mes informations dans une base de donnée SQL, je pourrais le faire via un fichier XML. Et la, je peux ré-utiliser mon interface facilement :)

Et puis je vais pas macher tout le travail non plus =)
Le jour où je veux le faire, je présenterai un projet complet et pas qu'un module de news :p
cs_Garno Messages postés 36 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 14 janvier 2009
8 août 2006 à 02:46
Salut,
Comme d'habitude la qualité est au rendez-vous et dans mon cas je vois une véritable innovation d'un côté de la programmation orienté objet auquel je n'avais pas du tout penser. L'idée d'utilisé une classe de la même façon qu'une "struct" en c++ est bien joué et je crois que je vais l'implenter dans plusieur de mes projets puisque sa me donne bien des idées :)

Malheureusement ta classe n'est pas exploitable dans l'état où elle est puisqu'il nous manque beaucoup d'informations importante tels la structure des tables mysql et surtout ta classe de base de données. Par contre c'est peut-être un plus puisque sa va obliger le monde à comprendre le fonctionnement exacte pour l'adapter à leur propre script ;)

Finalement, je ne vois pas l'intérêt d'avoir une interface dans cet exemple-ci puisque tu as seulement 1 classe pour 1 interface donc totalement inutile (je me trompe ??). De mon point de vu cela n'a pas de sens. Bref, très bonne source comme il s'en fait peu depuis quelques temps. Continue ton travail puisque sa m'aide bcp de l'évolution de ma programmation :D
audayls Messages postés 373 Date d'inscription samedi 9 juillet 2005 Statut Membre Dernière intervention 11 août 2008
7 août 2006 à 17:36
Okay, c'est bon çà je sais faire ! (N'empeche qu'il va faloir que j'apprenne les classes un jour moi - -')
Par contre, tu utilises MySQL mais tu n'as pas indiqué les tables à créer.
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
7 août 2006 à 00:36
Oui, faudrait juste renommer le constructeur, virer les exceptions, enlever les public/private/protected et ca marchera aussi bien :)

Ah oui, faut aussi modifier l'abstraction de classe et enlever les interfaces aussi =)
audayls Messages postés 373 Date d'inscription samedi 9 juillet 2005 Statut Membre Dernière intervention 11 août 2008
6 août 2006 à 23:32
Salut,
Venant de toi je suis sur que c'est extrement bien codé !
Par contre j'ai juste une question: je connais pas bien les classes mais penses tu qu'il est possible de dévellopper cette classe pour PHP 4 ?