Optimisez et allégez vos scripts !
Certaines techniques de codage en PHP permettent d'alléger le nombre de lignes d'un script et d'optimiser les temps de traitement. Je vais vous en présenter ici quelques-unes.
1. Les variables temporaires
Attention à l'utilisation abusive des variables temporaires dans votre code, parfois complètement inutiles. Exemple :
$password = $_GET['password'];
$login = $_GET['login'];
$adresse = $_GET['adresse'];
mysql_query('INSERT INTO. VALUES (''.$password.'',''.$login.'',''.$adresse.'')');
Cela est syntaxiquement correct mais ralentira le traitement de votre script et augmentera inutilement le nombre de lignes. Il est conseillé de procéder comme ceci :
mysql_query('INSERT INTO. VALUES (''.$_GET['password'].'',''.$_GET['login'].'',''.$_GET['adresse'].'')');
Il est cependant recommandé de les utiliser dans un cas de figure comme celui-ci :
for($i=0$i
Ici count($tableau) sera executé autant de fois qu'il y a de lignes dans mon tableau. La méthode à adopter est alors :
$max = count($tableau);
for($i=0$i<$max$i++) {. }
2. J'ai réécrit toutes les fonctions PHP moi-même...
Avant de se lancer tête baissée dans une fonction maison mélant boucles et conditions, pourquoi ne pas tout simplement consulter la documentation ?
PHP posséde énormement de fonctions perfomantes, qui allégeront votre code ! Voici quelques exemples pour mieux comprendre :
$variable = '2-31-10';
$temp = explode('-',$variable);
$var1 = $temp[0];
$var2 = $temp[1];
$var3 = $temp[2];
// Peut devenir :
list($var1,$var2,$var3) = explode('-',$variable);
/ /
$temp = explode('-',$variable);
$nb = count($temp);
for($i=0$i<$nb$i++) {
if($temp[$i] == 10) {
echo 'trouvé !';
}
}
// Peut s'écrire :
if(in_array(10,$temp)) echo 'trouvé !';
On peut de cette façon, accélérer le programme d'une part, le rendre plus lisible et plus compréhensible d'autre part.
3. Le copier / coller abusif
Pourquoi chercher soi-même alors que le net regorge de fonctions déjà écrites ? Tout simplement parce qu'il y a de tout et n'importe quoi, la plupart des fonctions trouvées peuvent être largement simplifiées. Il est utile de s'en inspirer mais pas de les copier sans comprendre !
Exemple que j'ai pu rencontrer : une fonction permettant d'afficher à l'écran les 100 premiers nombres premiers :
// Fonction trouvée en cherchant sur le net
$nombres=array(2,3);
$nb=4;
$limit=100;
while($nb<=$limit) {
$nbpremier=true;
foreach($nombres as $val) {
if($val!=1) {
if(gettype($nb/$val) == 'integer') {
$nbpremier=false;
}
}
}
if($nbpremier==true) {
$nombres[]=$nb;
}
$nbpremier=true;
$nb++;
}
foreach ($nombres as $nb) {
echo '$nb ';
}
En réfléchissant 5 minutes, on s'aperçoit vite qu'il est possible de faire beaucoup plus simple (et plus compréhensible encore une fois) :
for($i=2;$i<100;$i++) {
for($j=2;$j<$i;$j++) {
if(!($i%$j)) {
$j=$i;
} else {
if($j==$i-1) { echo $i,' '}
}
}
}
4. Instructions et conditions inutiles
Evitez le plus possible les conditions du genre if($i == 0) ou if($i != 0), à remplacer simplement par if(!$i) ou if($i).
L'instruction if. elseif. else est parfois inutile, ne pas reproduire le code suivant :
if($j) {
$b = true;
} else if($i) {
$b = true;
} else {
$b = false;
}
A remplacer par :
$b = false;
if($j || $i) $b = true;
De la même façon, évitez :
if($j) {
if($i) {
$b = true;
} else {
$b = false;
}
} else {
$b = false;
}
/** Remplacez par **/
$b = false;
if($i && $j) {
$b = true;
}
5. L'opérateur ternaire
- Cette technique ne va aucunement accélérer le temps d'éxecution du script (au contraire paraît-il...).
- Elle peut poser problème lors de la relecture et la compréhension générale du code.
Il est cependant intéressant de le connaître, on peut tomber parfois dessus en lisant des codes sources, ou simplement gagner un peu de temps en codant. Il ne faut pas en abuser...
L'une des instructions les plus basiques est l'instruction if. else, que l'on trouve la plupart du temps écrite sous cette forme :
if($i == $j) {
$b = true;
} else {
$b = false;
}
Le même test peut être réalisé à l'aide d'une structure beaucoup moins lourde. On utilise pour cela l'opérateur ternaire :
$b = ($i == $j) ? true : false;
Si la condition est évaluée à TRUE, alors la variable $b prendra pour valeur la partie gauche, placée après ? (true), dans le cas contraire, sa valeur sera celle de la partie droite, placée après : (false).
On peut par exemple, établir la connexion à une base de données en une seule ligne :
$connexion = mysql_connect('host','login','password') ? mysql_select_db('base') : die;
Si la connexion est établie, la variable $connexion est initialisée, sinon ce n'est pas la peine d'aller plus loin.
Prenez garde en essayant d'obtenir une structure if. elseif. else en utilisant plusieurs operateurs ternaires :
$i = true;
$j = false;
$b = $i ? 1 : $j ? 2 : 3;
Quel résultat allons-nous obtenir à votre avis ? Dans ce cas de figure, si $j ou $i est évalué à true, le résultat de $b sera 2, si $j et $i sont évalués à false, $b sera égal à 3. Dans tous les cas $b n'aura jamais pour valeur le chiffre 1.
Pour réaliser une condition if. elseif. else convenablement, utilisez les parenthèses !
echo $b = $i ? 1 : ($j ? 2 : 3);
// si $i évaluée à TRUE : $b = 1
// sinon si $j évaluée à TRUE : $b = 2
// sinon $j et $i sont évaluées à FALSE : $b = 3
6. Les accolades
Que ce soit pour une instruction ou une boucle, les accolades ne sont pas obligatoires. Une simple instruction if peut s'écrire sous cette forme :
if($i == $j) echo $k;
De la même façon, pour les boucles for et while :
$j = 0;
for($i=0$i<=100$i++) $j += $i;
$j = 0$i = 100;
while($i) $j += $i--;
Dans les deux cas $j sera le résultat de l'addition des chiffres de 1 à 100.
7. Exemples pratiques d'optimisation
Afficher les 100 premiers nombres premiers (hormis 2) :
for($i=2;$i<100;$i++) for($j=2;$j<$i;$j++) if(!($i%$j)) { $j=$i} else { if($j==$i-1) echo $i,' '}
Alterner la couleur des paragraphes d'une page (ordre inversé) :
$p = array('Paragraphe 1','Paragraphe 2','Paragraphe 3','Paragraphe 4','Paragraphe 5');
$i=count($p);
while($i) echo $i--%2 ? ''.$p[$i].'
' : ''.$p[$i].'
';
Ou bien :
$i=count($p);
while($i) {
$c = $i--%2 ? 'rouge' : 'bleu';
echo ''.$p[$i].'
';
}