8741 sujets

Développement web côté serveur, CMS

Pages :
(reprise du message précédent)

Accolades, j'utilise toujours, je trouve ça plus clair, surtout dans le cas où c'est cumulatif.

point-virgule, j'utilise toujours aussi, c'est une source d'erreur classique...


Une autre, plus général :
- des noms de fichiers clairs, s'il vous plaît... On évite les "actions1.php", "actions2.php",... c'est illisible...

Idem pour les noms d'images : texture1.png, texture2.png, texture3.png ou encore msg1.png; msg2.png; msg3.png c'est pas clair Smiley biggol



Ah oui, et sauf obligation, éviter les $_REQUEST pour récupérer les informations issues d'un formulaire.

Et tant qu'on y est, oubliez un peu les $HTTP_GET_VARS et autres $HTTP_SESSION_VARS; c'est obsolète... Smiley eek
Un truc pas assez connu (et qui touche de nombreux langages de programmation) : on ne doit jamais comparer l'égalité de nombres décimaux (flottants). Cela vient du fait que ces nombres ne peuvent pas toujours avoir de représentation exacte en binaire, on travaille donc avec des approximations.

Exemple :


$a = 2.7;
$b = 2.3 + 0.4; // devrait donner 2.7

if ($a == $b) {
	echo '<p>a et b sont égaux.</p>';
} else {
	echo '<p>a et b sont différents.</p>';
}

// affiche : a et b sont différents.


Test :


$a = 2.7;
$b = 2.3 + 0.4;

echo '0x' . bin2hex(pack('d', $a));
echo '<br>';
echo '0x' . bin2hex(pack('d', $b));


Une méthode pour faire cette comparaison est de comparer la valeur absolue de a - b et de la comparer à 0.00001 (l'epsilon). Si le résultat de la soustraction est plus petit que l'epsilon on considère que a et b sont égaux.

Exemple :


$a = 2.7;
$b = 2.3 + 0.4; // devrait donner 2.7

if (abs($a - $b) < 0.00001) {
	echo '<p>a et b sont égaux.</p>';
} else {
	echo '<p>a et b sont différents.</p>';
}

// affiche : a et b sont égaux.


Si on veut une meilleure précision il faut travailler avec une bibliothèque gérant les grands nombres. PHP intègre nativement BC Math qui permet de faire ça.

Exemple :


// avec BC Math (attention les nombres sont gérés sous forme de chaines de caractères !)

bcscale(5); // la précision qu'on souhaite (5 chiffres après la virgule)

$a = '2.7';
$b = bcadd('2.3', '0.4');

if (0 === bccomp($a, $b)) {
	echo '<p>a et b sont égaux.</p>';
} else {
	echo '<p>a et b sont différents.</p>';
}

// affiche : a et b sont égaux.


Question subsidiaire : combien de bugs vous avez laisser passer dans vos applications à cause de ça ? Smiley smile
Modifié par jb_gfx (22 Aug 2012 - 20:01)
Autre pratique pas assez connu, les références:


// Exemple sans référence

$a = 1;
$b = $a;  // De cette manière on affecte simplement la même valeur à $b, qu'a $a

=================
==== Mémoire ====
=================
= VAR == Valeur =
=================
=  a  ==    1   =
=================
=  b  ==    1   =
=================

$b = 2; // Seul la valeur de $b sera modifiée

var_dump($a, $b); // affiche int(1) int(2)

=================
==== Mémoire ====
=================
= VAR == Valeur =
=================
=  a  ==    1   =
=================
=  b  ==    2   =
=================

// Exemple avec référence

$a = 1;
$b = &$a;  // De cette manière $b fait référence à la valeur de $a (il agis comme un alias)

=================
==== Mémoire ====
=================
= VAR == Valeur =
=================
= a,b ==   1    =
=================

$b = 2; // La valeur de $a est modifiée par l'intermédiaire de $b

=================
==== Mémoire ====
=================
= VAR == Valeur =
=================
= a,b ==   2    =
=================

var_dump($a, $b); // affiche int(2) int(2)

$a = 3;

=================
==== Mémoire ====
=================
= VAR == Valeur =
=================
= a,b ==   3    =
=================

var_dump($a, $b); // affiche int(3) int(3)


ce cas de figure est peu parlant mais ça prends tout son sens dans des contextes de tableaux ou d'objets
Modifié par JJK801 (23 Aug 2012 - 09:16)
En effet, je ne me suis encore jamais servis l'élément "&" en php

Je comprend ton exemple JJK801 mais je n'ai jamais eu de situation ou l'utiliser
(notamment avec des objet)

si tu l'utilise JJK801 as-tu un exemple avec des class/objets où il est nécessaire(ou très utile) de l'utiliser ?


Sinon il y a le "@"

echo @nomDeFonction();


qui s'utilise pour empêcher l'affichage des messages d'erreurs
Alors je vois déjà les forumistes sauter au plafond et me dire: "Si une fonction est bien codé, elle n'affiche pas de message d'erreur !".
Je n'ai pas dis qu'il fallait l'utiliser, j'ai dis que ça existais Smiley cligne
Modifié par Traxyl2en1 (23 Aug 2012 - 14:39)
Traxyl2en1 a écrit :
En effet, je ne me suis encore jamais servis l'élément &quot;&amp;&quot; en php

Je comprend ton exemple JJK801 mais je n'ai jamais eu de situation ou l'utiliser
(notamment avec des objet)

si tu l'utilise JJK801 as-tu un exemple avec des class/objets où il est nécessaire(ou très utile) de l'utiliser ?


Un des exemples les plus faciles a comprendre, c'est l'usage avec le foreach, en général, quand tu l'utilise pour modifier des valeurs tu fait comme ceci:


$monTableau = array(1,2,3,4,5,6);

foreach($monTableau as $maClee => $maValeur)
{
  $monTableau[$maClee] = $maValeur * 10;
}

var_dump($monTableau); // Renvoi array(10,20,30,40,50,60)


avec la référence, tu fait ça:


$monTableau = array(1,2,3,4,5,6);

foreach($monTableau as &$maValeur)
{
  $maValeur *= 10;
}

var_dump($monTableau); // Renvoi array(10,20,30,40,50,60)


c'est aussi trés pratique pour ne pas avoir a récupérer les valeurs en retour de fonction:


function maFunction($maVar)
{
  return $maVar * 10;
}

$maVar = 1;
$maVar = maFuntion($maVar);
echo $maVar; // Renvoi 10


peut se remplacer par:


function maFunction(&$maVar)
{
  $maVar *= 10;
}

$maVar = 1;
maFuntion($maVar);
echo $maVar; // Renvoi 10


J'en profite pour parler des opérateurs mathématiques courts, pour ceux qui connaissent pas:

$maVar++ corresponds a une incrémentation de 1 de la variable
$maVar-- corresponds a une décrémentation de 1 de la variable
$maVar += 6 corresponds a une incrémentation de 6 de la variable
$maVar -= 6 corresponds a une décrémentation de 6 de la variable
$maVar *= 6 corresponds a une multiplication par 6 de la variable
$maVar /= 6 corresponds a une division par 6 de la variable
$maVar %= 6 corresponds au reste de la division par 6 de la variable (modulo)
JJK801 a écrit :
$maVar++ corresponds a une incrémentation de 1 de la variable
$maVar-- corresponds a une décrémentation de 1 de la variable

Je me permets de compléter en rappelant également qu'il existe des opérateurs qui y ressemblent bien mais qui diffèrent tout de même de ceux-ci.
++$maVar correspond à une incrémentation de 1 de la variable avant l'exécution de l'instruction dans laquelle elle est.
--$maVar correspond à une décrémentation de 1 de la variable avant l'exécution de l'instruction dans laquelle elle est.
Les deux tiennent incrémentent ou décrémentent la variable après l'exécution de l'instruction.
JJK801 a écrit :
Autre pratique pas assez connu, les références:


J'en profite pour rajouter que depuis PHP5 les objets sont toujours passés par références.
Traxyl2en1 a écrit :

Sinon il y a le &quot;@&quot;

echo @nomDeFonction();


qui s'utilise pour empêcher l'affichage des messages d'erreurs
Alors je vois déjà les forumistes sauter au plafond et me dire: &quot;Si une fonction est bien codé, elle n'affiche pas de message d'erreur !&quot;.
Je n'ai pas dis qu'il fallait l'utiliser, j'ai dis que ça existais Smiley cligne


Si on pouvait s'en tenir au topic et rester dans le sujet des "bonnes pratiques". Ce que tu montres là c'est tout le contraire. Il ne faut jamais utiliser @ devant le nom d'une fonction, à la place il faut mettre en place une gestion des erreurs solides. En plus le @ est hyper mauvais pour les performances.
Modifié par jb_gfx (23 Aug 2012 - 15:58)
JJK801 a écrit :

J'en profite pour parler des opérateurs mathématiques courts, pour ceux qui connaissent pas:


Fonctionne aussi avec les opérateurs de bit.
jb_gfx a écrit :
J'en profite pour rajouter que depuis PHP5 les objets sont toujours passés par références.


tout a fait et ils possèdent également un numéro d'instance qui permet de comparer deux objets pour vérifier qu'il j’agis bien de la même instance.

jb_gfx a écrit :
Fonctionne aussi avec les opérateurs de bit.


Reste poli, on les appel des Urologues Smiley langue
Merci JJK801 pour tes exemples parlant.
j'en sais un peu plus maintenant. Smiley smile
Je ne dis pas que je saurai l'utiliser parfaitement.
Je l'utiliserai au moins dans les foreach, c'est très pratique.


a écrit :

Si on pouvait s'en tenir au topic et rester dans le sujet des "bonnes pratiques". Ce que tu montres là c'est tout le contraire. Il ne faut jamais utiliser @ devant le nom d'une fonction, à la place il faut mettre en place une gestion des erreurs solides. En plus le @ est hyper mauvais pour les performances.


Je savais que ça ferai grincé des dents.
Mais je pense quand même que je reste dans le sujet car c'est dans la même ligné que le "&" et autres caractères spéciaux qui ont une signification en php; et le titre du sujet est : Trucs, astuces et bonnes pratiques et non Trucs, astuces pour de bonnes pratiques Smiley langue .

Bon ok je te taquine en jouant sur les mots, mais au moins ça permet de mettre en garde et d'expliquer pourquoi il faut ou ne faut pas l'utiliser.
Par exemple je ne savais pas que son utilisation influençait les performances, je l'utilise de temps en temps pour le debuggage de mes scripts.
[quote=Traxyl2en1]Merci JJK801 pour tes exemples parlant.
j'en sais un peu plus maintenant. Smiley smile
Je ne dis pas que je saurai l'utiliser parfaitement.
Je l'utiliserai au moins dans les foreach, c'est très pratique.


Si tu dois traiter des valeurs d'un gros tableau dans une fonction, tu peux utiliser le passage par référence pour traiter ton tableau, ainsi tu économises la mémoire.


function process(& $big_array) {
  //traitement
}

process($big_array);


Plutôt que :


function process($big_array) {
  //traitement
  return $big_array;
}

$big_array = process($big_array);
Gothor a écrit :

Je me permets de compléter en rappelant également qu'il existe des opérateurs qui y ressemblent bien mais qui diffèrent tout de même de ceux-ci.
++$maVar correspond à une incrémentation de 1 de la variable avant l'exécution de l'instruction dans laquelle elle est.
--$maVar correspond à une décrémentation de 1 de la variable avant l'exécution de l'instruction dans laquelle elle est.
Les deux tiennent incrémentent ou décrémentent la variable après l'exécution de l'instruction.

Dans le même style :

$string .= "blabla";

au lieu de

$string = $string."blabla"; (ou pire encore $string2 = $string1."blabla";)
Lothindil a écrit :

Dans le même style :

$string .= &quot;blabla&quot;;

au lieu de

$string = $string.&quot;blabla&quot;; (ou pire encore $string2 = $string1.&quot;blabla&quot;;)


Et si c'est pour faire un simple echo :


echo $string, 'blabla', $string2, 'machin', $string3;


Une autre astuces, utilisation de l'opérateur ternaire dans les templates (vues) :


<div class="username">
  Bienvenue <?php echo $user->isLogged() ? $user->username : 'invité'; ?>
</div>


Et l'opérateur ternaire raccourci (PHP 5.3+) :


<div>
  <?php echo $user->isLogged() ? : 'Vous n\'êtes pas identifié'; ?>
</div>

Modifié par jb_gfx (23 Aug 2012 - 17:52)
en condition aussi il existe encore une autre manière d’écrire


//version classique
if( ($a==$b && $c==$d) || $e==$f) {
 //do
}

//autre façon d'écrire
if( ($a==$b AND $c==$d) OR $e==$f) {
 //do
}


les condition sont surement les lignes de codes qui ont le plus de variations Smiley cligne
Alors je me permet de relancer un peux le sujet avec une question

alors ce n'est plus exactement du php mais du SQL

j'ai vue que dans certaines bonnes pratiques que on pouvait échapper/encadrer les noms de tables/colonnes entre des `` dans ses requêtes SQL.


SELECT `id` FROM `produits` WHERE `id` = 12


quelqu'un saurait il m'expliquer pour quelle raison exactement ?
Il semblerait que leur utilisation dépende de ton SGBD d'après ce thread.

Mais aussi :
http://docstore.mik.ua/orelly/weblinux2/mysql/ch15_01.htm a écrit :
When an identifier is also an SQL keyword, you must enclose the identifier in backticks:

CREATE TABLE `select` ( `table` INT NOT NULL PRIMARY KEY AUTO_INCREMENT);

Modifié par Gothor (27 Aug 2012 - 14:58)
en effet,

rien que connaitre la traduction de ce caractère ` en anglais(backticks, back quote) facilite grandement les recherches google Smiley lol

merci
Je connais pas la raison exacte de leur utilisation, mais je trouve ça assez pratique de ne pas avoir à les échapper en php puisque ce ne sont ni des double quotes ni des simple quotes.

Sinon un petit truc tout bête que j'utilise, je ne sais si d'autres le font :
J'utilise toujours echo ou <?= pour afficher du texte quand il doit vraiment s'afficher pour l'utilisateur, et print quand je veux juste afficher une variable ou autre chose pour débugger.
Comme ça quand j'ai fini de débugger j'ai juste à faire une recherche sur "print" pour retrouver tous mes print_r et mes print qu'il faut que je supprime.

PS : Je m'en sers de moins en moins avec xdebug, mais je trouve quand même que parfois ça va plus vite de faire un ou deux print bien placés que de lancer une session xdebug.
Pages :