Post by Olivier MassonPost by Bruno DesthuilliersEn PHP, c'est d'un intérêt limité (j'ai pas dit "inutile", hein...).
Ca a plus de sens dans un langage objet (un vrai, je veux dire), et -
en matière de développement web, avec un modèle d'exécution basé sur
un long running process.
Pourtant PHP5 est censé être pas mal objet non (et le 6 carrément donc) ?
Non. Les deux ont ajouté au modèle objet déjà existant dans PHP4, mais
ça ne fait pas de PHP un langage objet - au sens ou Python ou Ruby sont
des langages objet. En PHP, une chaine n'est pas un objet, un entier
n'est pas un objet, un array n'est pas un objet, une fonction n'est pas
un objet, etc etc.... Bref, PHP reste fondamentalement un langage
procédural.
Post by Olivier MassonJe doute que ce soit inutile tout de même (oui, tu l'as pas dit, ok.)
Non, je ne l'ai pas dit.
Post by Olivier MassonPost by Bruno DesthuilliersPost by Olivier Massonfunction changeQuery($add=array(),$del=array()) {
parse_str(urldecode($_SERVER['QUERY_STRING']),$output);
1/ t'a pas déclaré ni initialisé $output avant.
exact mais ça l'est en fait.
Oui, mais cette variable apparaît de nulle part, et on se demande d'où
elle vient. Ok, c'est un pattern courant en PHP, mais il heure
profondément ma sensibilité artistique !-)
Post by Olivier MassonPost by Bruno Desthuilliers2/ et si je veux travailler sur une autre url ? (ou, plus exactement,
la querystring d'une autre url).
Ben je veux pas :)
Tu parie que tu va en avoir besoin plus tôt que tu ne le crois ?-)
Post by Olivier MassonComme je l'ai dit, c'est adapté à mon contexte.
Donc quand tu aura le besoin de la même fonction mais pouvant bosser sur
n'importe quelle querystring arbitraire, tu fera un copié-collé et tu
aura deux implémentations à maintenir en parallèle ?
Post by Olivier MassonEt j'en profite pour indiquer un argument qui ne me convainc pas dans la
POO : c'est extensible, réutilisable...
Pas forcément plus que du fonctionnel ou du procédural. Cet argument là,
c'est un peu de l'huile de serpent, n'est-ce pas.
Post by Olivier Masson1/ des délais à tenir,
2/ des fonctions qui ne me serviront plus ou qui ne me serviront jamais
autrement,
je ne vois nullement l'intérêt de perdre du temps à rendre tout
parfaitement adaptable à tout contexte
Certaines fonctionnalités sont tellement spécifiques à un projet qu'il
serait effectivement inepte de vouloir les rendre générique. D'autre,
par contre, correspondent à des besoins récurrents, et il est parfois
très simple de les rendre tout de suite suffisament générique pour
couvrir la majorité des cas d'utilisation. C'est ici le cas, et
l'"effort" nécessaire est tellement dérisoire (deux lignes de code et 15
secondes de réflexion....) qu'il est AMHA dommage de ne pas l'avoir fait
immédiatement.
Post by Olivier Masson(c'est aussi valable pour du dev
non objet d'ailleurs.)
Tout à fait.
Post by Olivier MassonPost by Bruno DesthuilliersSi $del est un tableau vide, la boucle foreach ne sera de toutes
façons pas exécutée. Donc le test est inutile.
Ben non : Invalid argument supplied for foreach().
Le code suivant fonctionne très bien chez moi:
<?php
function foo($bar=array()) {
foreach($bar as $baz) {
echo $baz;
}
}
foo();
?>
Post by Olivier MassonFonctionne normalement avec ma condition inutile.
AMHA, tu a passé NULL en argument. Auquel cas - si c'est le "pattern"
d'utilisation recommendé - tu devrais tester sur "is_array", pas sur
"count". Mes deux centimes...
Post by Olivier MassonPost by Bruno DesthuilliersPost by Olivier Massonforeach ($del as $value) {
ce sont plutôt des clés, non ?-)
C'est vrai que ça fait couillon et peut nuire à la compréhension... mais
c'est comme ça (je vais qd même pas faire un flip juste pour pouvoir
lire les key !).
Je pensais juste au nommage. Effectivement, ce sont des valeurs, qui
correspondent à des clés dans le tableau représentant la querystring.
Personnellement, j'aurais utilisé "$param" ou "$name" pour éviter toute
ambiguité.
Post by Olivier MassonPost by Bruno DesthuilliersPost by Olivier Massonif (isset($output[$value])) unset($output[$value]);
if (isset($output[$value])) {
unset($output[$value]);
}
Je ne vois pas en quoi c'est incomplet.
cf plus bas.
Post by Olivier MassonA mon avis, question de style.
Tout à fait.
Post by Olivier MassonEn tout cas, je fais toujours comme ça quand je sais qu'il n'y aura rien
de plus après la condition.
JE SAIS que ça peut ne pas plaire, mais les accolades de partout, ça me
gonfle et je ne trouve pas ça DU TOUT plus lisible.
A l'inverse, les
($a==='prout')?'do_this':(($b==='crotte')?'youpi':'piyou'))
ça m'insupporte.
Avec deux opérateurs ternaires enchainés, effectivement, ça devient pénible.
Post by Olivier MassonIl y a aussi une question de gout. Y'en a qui mettent des switch dès la
moindre condition, y'en a (y'en a ?) qui aiment les endif, etc.
Les "endXXX" sont surtout prévus pour le code "embarqué" dans du html -
où les accolades fermantes sont peu lisibles.
Post by Olivier MassonPost by Bruno Desthuilliersle jour où tu veux ajouter un log, un trace ou quoi ou qu'est-ce, au
moins tu risques pas de manger une fermeture de bloc au passage...
Post by Olivier Masson}
$result = array_merge($output,$add);
Attention, il est parfaitement valide d'avoir plusieurs fois le même
paramètre dans une querystring (paramètre multivalué). Avec
array_merge, tu aura un remplacement pur et simple.
Alors ça, c'est une TRES BONNE remarque même si dans ce que tu cites ça
ne pose nullement problème.
En effet, des index sont ajoutés aux queries (si j'ai
?nom[]=bob&nom[]=tom, j'obtiens ?nom[0]=bob&nom[1]=tom).
Mais ça coince pour le del car le unset n'est plus bon.
Post by Bruno DesthuilliersPost by Olivier Massonreturn http_build_query($result, '', '&');
}
Manque quand même un truc : là tu renvoie une querystring, pas une URL
complète.
Ah ouais ça change tout et puis c'est balèze de reconstruire une url !
:)
Eh, tu postes ton code, je cherche la petite bête, hein ?-)
Je mentionnais surtout ça par "honnêteté" vis à vis de l'autre
magnifique (hahum...) example de code que nous avons si joyeusement
commenté - du point de vue fonctionnel, les deux codes ne sont pas
strictement équivalents. Quoique parler de "fonctionnel" pour l'autre
bout de code, c'est un peu exagéré !-)
Post by Olivier Masson(et en fait, c'est fait dans mes fonctions)