Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

:-) le betisier du PHP

12 réponses
Avatar
Pascal Boulerie
(Contexte : je suis grand débutant en PHP (je n'ai suivi aucune
formation), après avoir fait du Turbo-Pascal et du C durant les 20
dernières années...)
----------------------------------
Si vous enseignez le PHP et que vous aimez les anecdotes. :-)

1) Suite à un problème de serveurs DNS (un utilisateur obligé
d'accéder par l'adresse IP à un site distant), j'ai vu du code dans
lequel le programmeur avait déclaré en dur l'adresse de son serveur
'http://(adresse_URL)/, au lieu de déclarer le répertoire racine :

Code d'origine :
// define('HTTP_MAIN', 'http://(adresse_URL)/') ;

Code corrigé :
define('HTTP_MAIN', '/') ;


2) J'ai bondi en lisant la ligne suivante d'un fichier index.php, ce
genre de code compact (dans un style que l'on retrouve hélas
habituellement chez les programmeurs C) n'étant ni intuitif pour les
débutants, ni pédagogique ! :-(

$intro.= strlen($themes)>0 && $themes!="defaut"?"_".$themes:"" ;

10 réponses

1 2
Avatar
Bruno Desthuilliers
(snip)

2) J'ai bondi en lisant la ligne suivante d'un fichier index.php, ce
genre de code compact (dans un style que l'on retrouve hélas
habituellement chez les programmeurs C) n'étant ni intuitif pour les
débutants, ni pédagogique ! :-(

$intro.= strlen($themes)>0 && $themes!="defaut"?"_".$themes:"" ;


C'est surtout inutilement compliqué:

$intro .= ($themes && $themes != 'defaut' ? "_$themes" : '');

Mais je concède qu'en l'occurrence, un if explicite serait plus, heu...
explicite:

if ($themes && $themes != 'defaut') {
$intro .= "_$themes";
}

Avatar
Michel Billaud
Pascal Boulerie writes:

2) J'ai bondi en lisant la ligne suivante d'un fichier index.php, ce
genre de code compact (dans un style que l'on retrouve hélas
habituellement chez les programmeurs C) n'étant ni intuitif pour les
débutants, ni pédagogique ! :-(

$intro.= strlen($themes)>0 && $themes!="defaut"?"_".$themes:"" ;


Je ne conteste pas que l'exemple pourrait être mieux écrit, mais
l'argument comme quoi le code devrait être "intuitif" pour les débutants
ne me parait pas correct.

Les opinions esthétiques des débutants sur des langages de
programmation qu'ils ne connaissent pas ne présentent aucun intérêt
en ce qui concerne l'écriture de code destiné à être relu et maintenu
par des non-débutants !

Par ailleurs, l'intuition est surement une belle chose, mais elle se
base sur quoi ? Pour la syntaxe il va y avoir deux criteres :

- soit ce qui est écrit traduit directement l'intention. Ici ce
qu'exprime ce code, c'est que "si la chaine $themes n'est pas vide, ni
égale à défaut, on l'ajoute à $intro précédé d'un '_'". On ne peut pas
dire que ça soit le cas ici.

- soit c'est la tournure adoptée le plus souvent parmi la communauté des gens qui
pratiquent ce même langage pour faire ce genre de choses.


La première chose qui saute aux yeux, c'est le mauvais usage des espaces
qui rend pénible la lecture. Et quelques parenthèses peuvent améliorer
au besoin

$intro .= (strlen($themes) > 0) && ($themes != "defaut")
? "_".$themes
: "" ;


La chose qui fache le plus, c'est la manière de tester si la chaine
est vide. Il y a des manières plus standard de faire ça, sans aller
chercher une comparaison de la longueur, la plus simple
conceptuellement étant sans doute la comparaison avec la chaine vide !

$intro .= ($themes != "") && ($themes != "defaut")
? "_".$themes
: "" ;

reste l'idée d'allonger $intro seulement si la condition est
satisfaite, mieux traduite par un if/then que par une expression
conditionnelle (qui a ses mérites, mais pas ici).

if (($themes != "") && ($themes != "defaut"))
$intro .= "_".$themes;

et résisterait-on à utiliser une expansion plutot qu'une
concaténation ?

if (($themes != "") && ($themes != "defaut"))
$intro .= "_$themes";
MB

--
Michel BILLAUD
LABRI-Université Bordeaux I tel 05 4000 6922 / 05 5684 5792
351, cours de la Libération http://www.labri.fr/~billaud
33405 Talence (FRANCE)

Avatar
slambert
(Contexte : je suis grand débutant en PHP (je n'ai suivi aucune


.............

Si vous enseignez le PHP et que vous aimez les anecdotes. :-)


Alors, on vanne ses collègues et on dit du mal , hmm ?????

tssss tssss.......

Stef

Avatar
Mr Prout !

La chose qui fache le plus, c'est la manière de tester si la chaine
est vide. Il y a des manières plus standard de faire ça, sans aller
chercher une comparaison de la longueur, la plus simple
conceptuellement étant sans doute la comparaison avec la chaine vide !

$intro .= ($themes != "") && ($themes != "defaut")
? "_".$themes
: "" ;



Ou encore mieux, utiliser empty(), qui retourne FALSE lorsque l'on teste
une chaîne vide entre autre :

$intro .= (!empty($themes)) && ($themes != "defaut")
? "_".$themes
: "" ;

Avatar
Francois Girault
(Contexte : je suis grand débutant en PHP (je n'ai suivi aucune
formation), après avoir fait du Turbo-Pascal et du C durant les 20
dernières années...)
----------------------------------
Si vous enseignez le PHP et que vous aimez les anecdotes. :-)


google code search permet aussi de voir des horreurs :

http://www.google.com/codesearch?hl=en&lr=&q=SELECT+%5C*+FROM+%27%5C.%5C%24_GET

(merci à herodiade pour le lien)

--
FG

Avatar
Pascal Boulerie
Question opérateur conditionnel avec variable sans type :-( , voici
l'exemple le plus frappant à mes yeux que j'ai vu :-) :

$variable1 = variable1=='OUI'?1:0;
Avatar
Olivier Miakinen
Question opérateur conditionnel avec variable sans type :-( , voici
l'exemple le plus frappant à mes yeux que j'ai vu :-) :

$variable1 = variable1=='OUI'?1:0;
^^^^^^^^^

Utiliser le nom « variable1 » pour une constante, c'est assez rigolo.
Cela étant dit, je ne vois strictement pas où tu veux en venir.

Avatar
Pascal Boulerie
(Désolé, j'avais oublié le deuxième symbole "$" en reprenant le texte
de l'exemple de code en question.)
--------------------------------------------------------
Question opérateur conditionnel avec variable sans type :-( , voici
l'exemple le plus frappant à mes yeux que j'ai vu :-) :
$variable1 = $variable1=='OUI'?1:0;

Ce qui m'étonnait, c'était de partir d'une variable de type chaîne
pour aboutir à un Booléen, restocké immédiatement dans la même
variable... Mais vu que le langage n'est pas typé... :-(
Avatar
Olivier Miakinen
(Désolé, j'avais oublié le deuxième symbole "$" en reprenant le texte
de l'exemple de code en question.)
--------------------------------------------------------
Question opérateur conditionnel avec variable sans type :-( , voici
l'exemple le plus frappant à mes yeux que j'ai vu :-) :
$variable1 = $variable1=='OUI'?1:0;


D'accord.

Note que cet exemple n'est pas très aéré, et donc (à mon goût) pas très
$variable1 = ($variable1 == 'OUI') ? 1 : 0;

Ce qui m'étonnait, c'était de partir d'une variable de type chaîne
pour aboutir à un Booléen, restocké immédiatement dans la même
variable...


Non : pas un booléen mais un entier. Pour stocker un booléen, l'écriture
serait beaucoup plus simple :
$variable1 = $variable1 == 'OUI';

Note que j'ai déjà vu l'écriture suivante, parfaitement ridicule :
$variable1 = ($variable1 == 'OUI') ? true : false;

Mais vu que le langage n'est pas typé... :-(


Oui.

Avatar
Michel Billaud
Pascal Boulerie writes:

(Désolé, j'avais oublié le deuxième symbole "$" en reprenant le texte
de l'exemple de code en question.)
--------------------------------------------------------
Question opérateur conditionnel avec variable sans type :-( , voici
l'exemple le plus frappant à mes yeux que j'ai vu :-) :
$variable1 = $variable1=='OUI'?1:0;

Ce qui m'étonnait, c'était de partir d'une variable de type chaîne
pour aboutir à un Booléen,


Un entier, plutôt, vu qu'il n'y a pas de booléens en PHP
Du reste, on aurait pu faire
$variable1 = $variable1=='OUI';

restocké immédiatement dans la même
variable... Mais vu que le langage n'est pas typé... :-(


Absolument. Mais le problème n'est pas là, il y a des tas de langages
très bien où on peut faire ce genre de choses (Lisp, Smalltalk, etc.).

En fait cet exemple a 3 problèmes
- nom de variable mal choisi $variable1
- réutilisation d'une variable pour deux usages différents (chaine de caractère en entrée, condition)
- et utilisation d'une tournure maladroite ( X==Y ? 1 : 0 équivaut à X==Y)

et ce n'est pas la faute d'un langage si n'importe qui s'en empare
pour programmer comme un goret :-)


MB
--
Michel BILLAUD
LABRI-Université Bordeaux I tel 05 4000 6922 / 05 5684 5792
351, cours de la Libération http://www.labri.fr/~billaud
33405 Talence (FRANCE)

1 2