Texte
a référence clearPHP
Montréal, Québec, Canada. July 23rd 2015
L
Agenda
La référence clearPHP
Entièrement PHP
Faites la votre
Intervenant
Damien Seguy
CTO chez exakat
Français canadien canadien français
Services de revue de code automatique
Ca marche, ça?
<?php
function f($a, $a, $a) {
echo $a;
}
f('b', 'c', 'd');
?>
clearPHP : all-unique-arguments
Ca marche, ça?
<?php
function f($a, $a, $a) {
echo $a;
}
f('b', 'c', 'd');
?>
KO
en PHP
7
clearPHP : all-unique-arguments
Ca marche, ça?
<?php
function f($a, $a, $a) {
echo $a;
}
f('b', 'c', 'd');
?>
KO
en PHP
7
OK
en Python
clearPHP : all-unique-arguments
Standards de programmation
Symfony
Wordpress
Drupal
Typo3
Atoum
CakePHP
PEAR
PSR
Rafael Dohms
…
Wordpress Standards
Simple et Double Quotes
Indentation
Style d'Accolades
Expressions régulières
Pas de short PHP tags
Supprimer les espaces terminaux
Utilisation des espaces
Formatage des requêtes SQL
Requêtes de base de données
Conventions de nommage
Arguments de fonctions compréhensibles
Opérateur ternaire
Condition yoda
Code malin
Controleur d'erreur @
Eviter extract()
Wordpress Standards
Simple et Double Quotes
Indentation
Style d'Accolades
Expressions régulières
Pas de short PHP tags
Supprimer les espaces terminaux
Utilisation des espaces
Formatage des requêtes SQL
Requêtes de base de données
Conventions de nommage
Arguments de fonctions compréhensibles
Opérateur ternaire
Condition yoda
Code malin
Controleur d'erreur @
Eviter extract()
Wordpress Standards
Simple et Double Quotes
Indentation
Style d'Accolades
Expressions régulières
Pas de short PHP tags
Supprimer les espaces terminaux
Utilisation des espaces
Formatage des requêtes SQL
Requêtes de base de données
Conventions de nommage
Arguments de fonctions compréhensibles
Opérateur ternaire
Condition yoda
Code malin
Controleur d'erreur @
Eviter extract()
Wordpress Standards
Simple et Double Quotes
Indentation
Style d'Accolades
Expressions régulières
Pas de short PHP tags
Supprimer les espaces terminaux
Utilisation des espaces
Formatage des requêtes SQL
Requêtes de base de données
Conventions de nommage
Arguments de fonctions compréhensibles
Opérateur ternaire
Condition yoda
Code malin
Controleur d'erreur @
Eviter extract()
Wordpress Standards
Simple et Double Quotes
Indentation
Style d'Accolades
Expressions régulières
Pas de short PHP tags
Supprimer les espaces terminaux
Utilisation des espaces
Formatage des requêtes SQL
Requêtes de base de données
Conventions de nommage
Arguments de fonctions compréhensibles
Opérateur ternaire
Condition yoda
Code malin
Controleur d'erreur @
Eviter extract()
Wordpress Standards
Simple et Double Quotes
Indentation
Style d'Accolades
Expressions régulières
Pas de short PHP tags
Supprimer les espaces terminaux
Utilisation des espaces
Formatage des requêtes SQL
Requêtes de base de données
Conventions de nommage
Arguments de fonctions compréhensibles
Opérateur ternaire
Condition yoda
Code malin
Controleur d'erreur @
Eviter extract()
Wordpress Standards
Simple et Double Quotes
Indentation
Style d'Accolades
Expressions régulières
Pas de short PHP tags
Supprimer les espaces terminaux
Utilisation des espaces
Formatage des requêtes SQL
Requêtes de base de données
Conventions de nommage
Arguments de fonctions compréhensibles
Opérateur ternaire
Condition yoda
Code malin
Controleur d'erreur @
Eviter extract()
Wordpress Standards
Simple et Double Quotes
Indentation
Style d'Accolades
Expressions régulières
Pas de short PHP tags
Supprimer les espaces terminaux
Utilisation des espaces
Formatage des requêtes SQL
Requêtes de base de données
Conventions de nommage
Arguments de fonctions compréhensibles
Opérateur ternaire
Condition yoda
Code malin
Controleur d'erreur @
Eviter extract()
Convention de code
Conception
Référence de 

programmation PHP
Pièges classiques en PHP
C'est grave, docteur?
<?php
class w extends v {
function f($a, $b = 2, $c) {
echo $a;
}
}
?>
clearPHP : argument-with-default-at-the-end
C'est grave, docteur?
<?php
class w extends v {
function f($a, $b = 2, $c) {
echo $a;
}
}
?>
Toujours en PHP
7
clearPHP : argument-with-default-at-the-end
Où ça, une erreur?
<?php
if (($h = file_get_contents($uri)) == '') {
print "Error : couldn't access siten";
} else {
process_html($h);
}
?>
clearPHP : strict-comparisons
Something to avoid ?
• array_search
• collator_compare
• collator_get_sort_key
• current
• fgetc
• file_get_contents
• file_put_contents
• iconv_strpos
• iconv_strrpos
• imagecolorallocate
• imagecolorallocatealpha
• mb_strlen
• next
• pcntl_getpriority
• preg_match
• preg_match_all
• prev
• readdir
• stripos
• strpos
• strripos
• strrpos
• strtok
clearPHP : strict-comparisons
Something to avoid ?
• array_search
• collator_compare
• collator_get_sort_key
• current
• fgetc
• file_get_contents
• file_put_contents
• iconv_strpos
• iconv_strrpos
• imagecolorallocate
• imagecolorallocatealpha
• mb_strlen
• next
• pcntl_getpriority
• preg_match
• preg_match_all
• prev
• readdir
• stripos
• strpos
• strripos
• strrpos
• strtok
clearPHP : strict-comparisons
Où ça, une erreur?
<?php
switch (file_get_contents($uri)) {
case false :
// code1
case '' :
// code2
default :
// code3
}
?>
clearPHP : strict-comparisons
Et pourtant, ça marche
<?php
$array1 = ['a', 'b'];
$array2 = ['c', 'd'];
foreach ($array1 as &$f) { }
foreach ($array2 as $f) { }
print_r($array1);
print_r($array2);
clearPHP : no-dangling-reference
Et pourtant, ça marche
Array
(
[0] => a
[1] => d
)
Array
(
[0] => c
[1] => d
)
clearPHP : no-dangling-reference
Et pourtant, ça marche
<?php
$array1 = ['a', 'b'];
$array2 = ['c', 'd'];
foreach ($array1 as &$f) { }
unset($f);
foreach ($array2 as $f) { }
print_r($array1);
print_r($array2);
clearPHP : no-dangling-reference
C'est bien la même chose
<?php
$x = true;
$y = false;
$z1 = $x and $y;
$z2 = $x && $y;
?>
clearPHP : no-letter-logical
C'est toujours la même chose
<?php
try {
} catch (ClasseInexistante $e) {
} catch (PasUneException $e) {
}
clearPHP : no-unresolved-catch
C'est toujours la même chose
<?php
try {
} catch (ClasseInexistante $e) {
} catch (PasUneException $e) {
}
Ceci est du code mort
clearPHP : no-unresolved-catch
C'est toujours la même chose
<?php
try {
} catch (ClasseInexistante $e) {
} catch (PasUneException $e) {
}
Ceci est du code mort
clearPHP : no-unresolved-catch
Ceci est du code mort
C'est toujours la même chose
<?php
namespace X;
try {
} catch (Exception $e) {
}
?>
clearPHP : no-unresolved-catch
C'est toujours la même chose
<?php
namespace X;
try {
} catch (Exception $e) {
}
?>
Encore du code mort
clearPHP : no-unresolved-catch
C'est toujours la même chose
<?php
if ($x instanceof UneClasse) {
$y = $x->convert();
}
?>
clearPHP : no-unresolved-instanceof
C'est toujours la même chose
<?php
if ($x instanceof UneClasse) {
$y = $x->convert();
}
?>
Ceci est du code mort
clearPHP : no-unresolved-instanceof
Performances
Ça rame
<?php
define('DAY_IN_SECONDS', 24 * 60 * 60);
define('DAY_IN_SECONDS', 86400);
const DAY_IN_SECONDS = 86400;
?>
clearPHP : always-preprocess
Ça rame
<?php
define('DAY_IN_SECONDS', 24 * 60 * 60);
define('DAY_IN_SECONDS', 86400);
const DAY_IN_SECONDS = 86400;
?>
clearPHP : always-preprocess
Ça rame
<?php
define('DAY_IN_SECONDS', 24 * 60 * 60);
define('DAY_IN_SECONDS', 86400);
const DAY_IN_SECONDS = 86400;
?>
clearPHP : always-preprocess
Ça rame
<?php
$x = [];
$x['id'] = 0;
$x['username'] = 'bibi';
$x['creation'] = time();
?>
clearPHP : always-preprocess
Ça rame
<?php
$x = [];
$x['id'] = 0;
$x['username'] = 'bibi';
$x['creation'] = time();
?>
clearPHP : always-preprocess
<?php
$x = [ 'id' => 0,
'username' => 'bibi',
'creation' => time(),
];
?>
Ça rame
<?php
echo "<p>";
echo $paragraphe;
echo "</p>";
?>
clearPHP : no-repeated-print
Ça rame
<?php
$array = $source->fetchData();
$array = array_unique($array);
?>
clearPHP : avoid-those-slow-functions
Ça rame
<?php
$array = $source->fetchData();
$array = array_unique($array);
?>
clearPHP : avoid-those-slow-functions
<?php
$array = $source->fetchData();
$array = array_keys(
array_count_values($array));
?>
Ça rame
clearPHP : no-array_merge-in-loop
<?php
$merged = [];
foreach($array as $id => $row) {
$array[$id][4] = VAT * $row[2];
$merged = array_merge($merged, $row);
}
?>
clearPHP : use-reference-to-alter-in-foreach
Ça rame
clearPHP : no-array_merge-in-loop
<?php
$merged = [];
foreach($array as $id => $row) {
$array[$id][4] = VAT * $row[2];
$merged = array_merge($merged, $row);
}
?>
<?php
foreach($array as &$row) {
$row[4] = VAT * $row[2];
}
unset($row);
$merge =
call_user_func_array('array_merge',
$array);
?>
clearPHP : use-reference-to-alter-in-foreach
Trucs PHP
C'est pas logique
<?php
switch ($x) {
default :
// something useful
break;
default :
// something else and useful
break;
}
clearPHP : no-switch-with-multiple-default
C'est pas logique
<?php
switch ($x) {
default :
// something useful
break;
default :
// something else and useful
break;
}
Toujours du code mort
clearPHP : no-switch-with-multiple-default
C'est pas logique
<?php
switch ($x) {
default :
// something useful
break;
default :
// something else and useful
break;
}
Toujours du code mort
clearPHP : no-switch-with-multiple-defaultNon valide en PHP
7
C'est pas logique
<?php
switch ($x) {
case 1 :
// something useful
break;
case 1 :
// something useful
break;
}
clearPHP : no-duplicate-case
C'est pas logique
<?php
switch ($x) {
case 1 :
// something useful
break;
case 1 :
// something useful
break;
}
C'est aussi du code mort
clearPHP : no-duplicate-case
C'est pas logique
<?php
switch ($x) {
case 1 :
// something useful
break;
case 1 :
// something useful
break;
}
C'est aussi du code mort
clearPHP : no-duplicate-case
Toujours en PHP
7
C'est pas logique
<?php
$array = ['png' => 'image/png',
'jpg' => 'image/jpg',
'jpeg' => 'image/jpeg',
'gif' => 'image/gif',
'webp' => 'image/webp',
'wbmp' => 'image/wbmp',
'png' => 'image/png',
];
?>clearPHP : no-duplicate-key
C'est pas logique
<?php
$array = ['png' => 'image/png',
'jpg' => 'image/jpg',
'jpeg' => 'image/jpeg',
'gif' => 'image/gif',
'webp' => 'image/webp',
'wbmp' => 'image/wbmp',
'png' => 'image/png',
];
?>clearPHP : no-duplicate-key
C'est pas logique
<?php
$array = [ 1 => 2,
'1' => 4,
5 => 6,
7 => 8,
9 => 10,
11 => 12,
1.3 => 14
];
deux
d'entre
eux
seront
détruits
clearPHP : no-duplicate-key
C'est pas logique
<?php
$array = [ 1 => 2,
'1' => 4,
5 => 6,
7 => 8,
9 => 10,
11 => 12,
1.3 => 14
];
deux
d'entre
eux
seront
détruits
clearPHP : no-duplicate-key
C'est pas logique
<?php
$array = [ 1 => 2,
'1' => 4,
5 => 6,
7 => 8,
9 => 10,
11 => 12,
1.3 => 14
];
deux
d'entre
eux
seront
détruits
clearPHP : no-duplicate-key
Surtout pas!
<?php
$content = @file_get_contents($uri);
?>
clearPHP : no-noscream
C'est pas possible!
<?php
class user {
public static getName() {
return $this->name;
}
}
?>
clearPHP : no-static-this
C'est pas possible!
<?php
class user {
public static getName() {
return $this->name;
}
}
?>
clearPHP : no-static-this
Toujours en PHP
7
Pas spécifique à PHP
Ternaire, c'est fou!
<?php
$credit = ( !is_array($_credit)) ?
PtoBR(propre($_credit)) :
( $_credit['url'] ? '<a href="' .
$_credit['url'] . '">' : '') .
$_credit['nom'] . ( $_credit['url'] ?
'</a>' : '');
?>
clearPHP : no-nested-ternary
Ternaire, c'est fou!
<?php
$credit = ( !is_array($_credit)) ?
PtoBR(propre($_credit)) :
( $_credit['url'] ? '<a href="' .
$_credit['url'] . '">' : '') .
$_credit['nom'] . ( $_credit['url'] ?
'</a>' : '');
?>
clearPHP : no-nested-ternary
Ternaire, c'est fou!
<?php
$credit = ( !is_array($_credit)) ?
PtoBR(propre($_credit)) :
( $_credit['url'] ? '<a href="' .
$_credit['url'] . '">' : '') .
$_credit['nom'] . ( $_credit['url'] ?
'</a>' : '');
?>
clearPHP : no-nested-ternary
Gravé dans le marbre
<?php
$ftp_user = 'foo';
$ftp_pass = 'bar';
// Connexion
$conn_id = ftp_connect('ftp.example.ca');
// Authentification
ftp_login($conn_id, $ftp_user, $ftp_pass);
?>
clearPHP : no-hardcoded-credential
Étrange, étrange
<?php
class user {
public static countOdd($array) {
return count(array_filter(
$array,
function ($x) { return $x % 2;}
);
}
}
?>
clearPHP : not-a-method
C'est inutile
<?php
interface i { function getI(); }
class x implements i {
function getI() { return rand(0, 10); }
}
?>
clearPHP : no-useless-interfaces
<?php
// actually useful interfaces
function negateI(i $x) {
return - $x->getI();
}
function sumI(array $a) {
$r = 0;
foreach($a as $b) {
if ($x instanceof i) {
$r += $x->getI();
}
}
return $r;
}
clearPHP : no-useless-interfaces
<?php
// actually useful interfaces
function negateI(i $x) {
return - $x->getI();
}
function sumI(array $a) {
$r = 0;
foreach($a as $b) {
if ($x instanceof i) {
$r += $x->getI();
}
}
return $r;
}
clearPHP : no-useless-interfaces
<?php
// actually useful interfaces
function negateI(i $x) {
return - $x->getI();
}
function sumI(array $a) {
$r = 0;
foreach($a as $b) {
if ($x instanceof i) {
$r += $x->getI();
}
}
return $r;
}
clearPHP : no-useless-interfaces
clearPHP
https://github.com/
dseguy/clearPHP
114 règles de bonne
programmation PHP
clearPHP
Nom
Explications
Exemples
Quand l'éviter
Bibliographie
En Français dans le texte
Wordpress Standards
no-double-quote
Indentation
Style d'Accolades
Expressions régulières
no-short-tags
Supprimer les espaces terminaux
Utilisation des espaces
Formatage des requêtes SQL
Requêtes de base de données

(always-prepare-statement)
Conventions de nommage
Arguments de fonctions compréhensibles
[no-nested-ternary]
yoda-condition
no-implied-if
no-noscream
know-your-variables
Bug à la con
<?php
$php = 'opendir ('.');';
$y = eval($php);
?>
clearPHP : no-double-quotes
Une référence est un choix
no-double-quote
no-recalculate
no-unused-methods
no-useless-interfaces
not-a-method
Sources
Manuel PHP
Articles de la communauté
Bonnes pratiques
Commentaires sur le repo de clearPHP
Faites votre référence
Lisez la liste des règles
Choisissez vos règles
préférées
Omettez les règles que
vous méprisez
Adoptez vos propres
règles
D'autres règles à venir?
Utilisez les typehint (argument et réponse)
Créez toujours un constructeur dans une classe
East-oriented programming
Lavez-vous les mains avant de coder
Contribuez à clearPHP
Nouvelles règles
Discussions sur les règles existantes
Traduction en français, chinois ou autre
Complément de bibliographie,
Exemples et cas particuliers
Améliorations ?
<?php
echo ("<p>" . $paragraph . "</p>");
?>
Améliorations ?
<?php
echo "<p>" . $paragraph . "</p>";
?>
clearPHP : no-parenthesis-for-language-construct
Améliorations ?
<?php
echo "<p>", $paragraph, "</p>";
?>
clearPHP : no-unnecessary-string-concatenation
Texte
Thanks!
@faguo, dseguy@exakat.com,
https://github.com/dseguy/clearPHP
clearPHP
Rules to write good PHP code
Rules to write PHP code
Largest list of recommendations
Cherry pick your selection
No one knows why
Looks like old PHP 4
Bad for performance
Bad for security
Bad for maintenance
Newbie mistake
Bad for testing

La référence Clear php

  • 1.
    Texte a référence clearPHP Montréal,Québec, Canada. July 23rd 2015 L
  • 2.
  • 3.
    Intervenant Damien Seguy CTO chezexakat Français canadien canadien français Services de revue de code automatique
  • 4.
    Ca marche, ça? <?php functionf($a, $a, $a) { echo $a; } f('b', 'c', 'd'); ?> clearPHP : all-unique-arguments
  • 5.
    Ca marche, ça? <?php functionf($a, $a, $a) { echo $a; } f('b', 'c', 'd'); ?> KO en PHP 7 clearPHP : all-unique-arguments
  • 6.
    Ca marche, ça? <?php functionf($a, $a, $a) { echo $a; } f('b', 'c', 'd'); ?> KO en PHP 7 OK en Python clearPHP : all-unique-arguments
  • 7.
  • 8.
    Wordpress Standards Simple etDouble Quotes Indentation Style d'Accolades Expressions régulières Pas de short PHP tags Supprimer les espaces terminaux Utilisation des espaces Formatage des requêtes SQL Requêtes de base de données Conventions de nommage Arguments de fonctions compréhensibles Opérateur ternaire Condition yoda Code malin Controleur d'erreur @ Eviter extract()
  • 9.
    Wordpress Standards Simple etDouble Quotes Indentation Style d'Accolades Expressions régulières Pas de short PHP tags Supprimer les espaces terminaux Utilisation des espaces Formatage des requêtes SQL Requêtes de base de données Conventions de nommage Arguments de fonctions compréhensibles Opérateur ternaire Condition yoda Code malin Controleur d'erreur @ Eviter extract()
  • 10.
    Wordpress Standards Simple etDouble Quotes Indentation Style d'Accolades Expressions régulières Pas de short PHP tags Supprimer les espaces terminaux Utilisation des espaces Formatage des requêtes SQL Requêtes de base de données Conventions de nommage Arguments de fonctions compréhensibles Opérateur ternaire Condition yoda Code malin Controleur d'erreur @ Eviter extract()
  • 11.
    Wordpress Standards Simple etDouble Quotes Indentation Style d'Accolades Expressions régulières Pas de short PHP tags Supprimer les espaces terminaux Utilisation des espaces Formatage des requêtes SQL Requêtes de base de données Conventions de nommage Arguments de fonctions compréhensibles Opérateur ternaire Condition yoda Code malin Controleur d'erreur @ Eviter extract()
  • 12.
    Wordpress Standards Simple etDouble Quotes Indentation Style d'Accolades Expressions régulières Pas de short PHP tags Supprimer les espaces terminaux Utilisation des espaces Formatage des requêtes SQL Requêtes de base de données Conventions de nommage Arguments de fonctions compréhensibles Opérateur ternaire Condition yoda Code malin Controleur d'erreur @ Eviter extract()
  • 13.
    Wordpress Standards Simple etDouble Quotes Indentation Style d'Accolades Expressions régulières Pas de short PHP tags Supprimer les espaces terminaux Utilisation des espaces Formatage des requêtes SQL Requêtes de base de données Conventions de nommage Arguments de fonctions compréhensibles Opérateur ternaire Condition yoda Code malin Controleur d'erreur @ Eviter extract()
  • 14.
    Wordpress Standards Simple etDouble Quotes Indentation Style d'Accolades Expressions régulières Pas de short PHP tags Supprimer les espaces terminaux Utilisation des espaces Formatage des requêtes SQL Requêtes de base de données Conventions de nommage Arguments de fonctions compréhensibles Opérateur ternaire Condition yoda Code malin Controleur d'erreur @ Eviter extract()
  • 15.
    Wordpress Standards Simple etDouble Quotes Indentation Style d'Accolades Expressions régulières Pas de short PHP tags Supprimer les espaces terminaux Utilisation des espaces Formatage des requêtes SQL Requêtes de base de données Conventions de nommage Arguments de fonctions compréhensibles Opérateur ternaire Condition yoda Code malin Controleur d'erreur @ Eviter extract()
  • 16.
  • 17.
  • 18.
    C'est grave, docteur? <?php classw extends v { function f($a, $b = 2, $c) { echo $a; } } ?> clearPHP : argument-with-default-at-the-end
  • 19.
    C'est grave, docteur? <?php classw extends v { function f($a, $b = 2, $c) { echo $a; } } ?> Toujours en PHP 7 clearPHP : argument-with-default-at-the-end
  • 20.
    Où ça, uneerreur? <?php if (($h = file_get_contents($uri)) == '') { print "Error : couldn't access siten"; } else { process_html($h); } ?> clearPHP : strict-comparisons
  • 21.
    Something to avoid? • array_search • collator_compare • collator_get_sort_key • current • fgetc • file_get_contents • file_put_contents • iconv_strpos • iconv_strrpos • imagecolorallocate • imagecolorallocatealpha • mb_strlen • next • pcntl_getpriority • preg_match • preg_match_all • prev • readdir • stripos • strpos • strripos • strrpos • strtok clearPHP : strict-comparisons
  • 22.
    Something to avoid? • array_search • collator_compare • collator_get_sort_key • current • fgetc • file_get_contents • file_put_contents • iconv_strpos • iconv_strrpos • imagecolorallocate • imagecolorallocatealpha • mb_strlen • next • pcntl_getpriority • preg_match • preg_match_all • prev • readdir • stripos • strpos • strripos • strrpos • strtok clearPHP : strict-comparisons
  • 23.
    Où ça, uneerreur? <?php switch (file_get_contents($uri)) { case false : // code1 case '' : // code2 default : // code3 } ?> clearPHP : strict-comparisons
  • 24.
    Et pourtant, çamarche <?php $array1 = ['a', 'b']; $array2 = ['c', 'd']; foreach ($array1 as &$f) { } foreach ($array2 as $f) { } print_r($array1); print_r($array2); clearPHP : no-dangling-reference
  • 25.
    Et pourtant, çamarche Array ( [0] => a [1] => d ) Array ( [0] => c [1] => d ) clearPHP : no-dangling-reference
  • 26.
    Et pourtant, çamarche <?php $array1 = ['a', 'b']; $array2 = ['c', 'd']; foreach ($array1 as &$f) { } unset($f); foreach ($array2 as $f) { } print_r($array1); print_r($array2); clearPHP : no-dangling-reference
  • 27.
    C'est bien lamême chose <?php $x = true; $y = false; $z1 = $x and $y; $z2 = $x && $y; ?> clearPHP : no-letter-logical
  • 32.
    C'est toujours lamême chose <?php try { } catch (ClasseInexistante $e) { } catch (PasUneException $e) { } clearPHP : no-unresolved-catch
  • 33.
    C'est toujours lamême chose <?php try { } catch (ClasseInexistante $e) { } catch (PasUneException $e) { } Ceci est du code mort clearPHP : no-unresolved-catch
  • 34.
    C'est toujours lamême chose <?php try { } catch (ClasseInexistante $e) { } catch (PasUneException $e) { } Ceci est du code mort clearPHP : no-unresolved-catch Ceci est du code mort
  • 35.
    C'est toujours lamême chose <?php namespace X; try { } catch (Exception $e) { } ?> clearPHP : no-unresolved-catch
  • 36.
    C'est toujours lamême chose <?php namespace X; try { } catch (Exception $e) { } ?> Encore du code mort clearPHP : no-unresolved-catch
  • 37.
    C'est toujours lamême chose <?php if ($x instanceof UneClasse) { $y = $x->convert(); } ?> clearPHP : no-unresolved-instanceof
  • 38.
    C'est toujours lamême chose <?php if ($x instanceof UneClasse) { $y = $x->convert(); } ?> Ceci est du code mort clearPHP : no-unresolved-instanceof
  • 39.
  • 40.
    Ça rame <?php define('DAY_IN_SECONDS', 24* 60 * 60); define('DAY_IN_SECONDS', 86400); const DAY_IN_SECONDS = 86400; ?> clearPHP : always-preprocess
  • 41.
    Ça rame <?php define('DAY_IN_SECONDS', 24* 60 * 60); define('DAY_IN_SECONDS', 86400); const DAY_IN_SECONDS = 86400; ?> clearPHP : always-preprocess
  • 42.
    Ça rame <?php define('DAY_IN_SECONDS', 24* 60 * 60); define('DAY_IN_SECONDS', 86400); const DAY_IN_SECONDS = 86400; ?> clearPHP : always-preprocess
  • 43.
    Ça rame <?php $x =[]; $x['id'] = 0; $x['username'] = 'bibi'; $x['creation'] = time(); ?> clearPHP : always-preprocess
  • 44.
    Ça rame <?php $x =[]; $x['id'] = 0; $x['username'] = 'bibi'; $x['creation'] = time(); ?> clearPHP : always-preprocess <?php $x = [ 'id' => 0, 'username' => 'bibi', 'creation' => time(), ]; ?>
  • 45.
    Ça rame <?php echo "<p>"; echo$paragraphe; echo "</p>"; ?> clearPHP : no-repeated-print
  • 46.
    Ça rame <?php $array =$source->fetchData(); $array = array_unique($array); ?> clearPHP : avoid-those-slow-functions
  • 47.
    Ça rame <?php $array =$source->fetchData(); $array = array_unique($array); ?> clearPHP : avoid-those-slow-functions <?php $array = $source->fetchData(); $array = array_keys( array_count_values($array)); ?>
  • 48.
    Ça rame clearPHP :no-array_merge-in-loop <?php $merged = []; foreach($array as $id => $row) { $array[$id][4] = VAT * $row[2]; $merged = array_merge($merged, $row); } ?> clearPHP : use-reference-to-alter-in-foreach
  • 49.
    Ça rame clearPHP :no-array_merge-in-loop <?php $merged = []; foreach($array as $id => $row) { $array[$id][4] = VAT * $row[2]; $merged = array_merge($merged, $row); } ?> <?php foreach($array as &$row) { $row[4] = VAT * $row[2]; } unset($row); $merge = call_user_func_array('array_merge', $array); ?> clearPHP : use-reference-to-alter-in-foreach
  • 50.
  • 51.
    C'est pas logique <?php switch($x) { default : // something useful break; default : // something else and useful break; } clearPHP : no-switch-with-multiple-default
  • 52.
    C'est pas logique <?php switch($x) { default : // something useful break; default : // something else and useful break; } Toujours du code mort clearPHP : no-switch-with-multiple-default
  • 53.
    C'est pas logique <?php switch($x) { default : // something useful break; default : // something else and useful break; } Toujours du code mort clearPHP : no-switch-with-multiple-defaultNon valide en PHP 7
  • 54.
    C'est pas logique <?php switch($x) { case 1 : // something useful break; case 1 : // something useful break; } clearPHP : no-duplicate-case
  • 55.
    C'est pas logique <?php switch($x) { case 1 : // something useful break; case 1 : // something useful break; } C'est aussi du code mort clearPHP : no-duplicate-case
  • 56.
    C'est pas logique <?php switch($x) { case 1 : // something useful break; case 1 : // something useful break; } C'est aussi du code mort clearPHP : no-duplicate-case Toujours en PHP 7
  • 57.
    C'est pas logique <?php $array= ['png' => 'image/png', 'jpg' => 'image/jpg', 'jpeg' => 'image/jpeg', 'gif' => 'image/gif', 'webp' => 'image/webp', 'wbmp' => 'image/wbmp', 'png' => 'image/png', ]; ?>clearPHP : no-duplicate-key
  • 58.
    C'est pas logique <?php $array= ['png' => 'image/png', 'jpg' => 'image/jpg', 'jpeg' => 'image/jpeg', 'gif' => 'image/gif', 'webp' => 'image/webp', 'wbmp' => 'image/wbmp', 'png' => 'image/png', ]; ?>clearPHP : no-duplicate-key
  • 59.
    C'est pas logique <?php $array= [ 1 => 2, '1' => 4, 5 => 6, 7 => 8, 9 => 10, 11 => 12, 1.3 => 14 ]; deux d'entre eux seront détruits clearPHP : no-duplicate-key
  • 60.
    C'est pas logique <?php $array= [ 1 => 2, '1' => 4, 5 => 6, 7 => 8, 9 => 10, 11 => 12, 1.3 => 14 ]; deux d'entre eux seront détruits clearPHP : no-duplicate-key
  • 61.
    C'est pas logique <?php $array= [ 1 => 2, '1' => 4, 5 => 6, 7 => 8, 9 => 10, 11 => 12, 1.3 => 14 ]; deux d'entre eux seront détruits clearPHP : no-duplicate-key
  • 62.
    Surtout pas! <?php $content =@file_get_contents($uri); ?> clearPHP : no-noscream
  • 63.
    C'est pas possible! <?php classuser { public static getName() { return $this->name; } } ?> clearPHP : no-static-this
  • 64.
    C'est pas possible! <?php classuser { public static getName() { return $this->name; } } ?> clearPHP : no-static-this Toujours en PHP 7
  • 65.
  • 66.
    Ternaire, c'est fou! <?php $credit= ( !is_array($_credit)) ? PtoBR(propre($_credit)) : ( $_credit['url'] ? '<a href="' . $_credit['url'] . '">' : '') . $_credit['nom'] . ( $_credit['url'] ? '</a>' : ''); ?> clearPHP : no-nested-ternary
  • 67.
    Ternaire, c'est fou! <?php $credit= ( !is_array($_credit)) ? PtoBR(propre($_credit)) : ( $_credit['url'] ? '<a href="' . $_credit['url'] . '">' : '') . $_credit['nom'] . ( $_credit['url'] ? '</a>' : ''); ?> clearPHP : no-nested-ternary
  • 68.
    Ternaire, c'est fou! <?php $credit= ( !is_array($_credit)) ? PtoBR(propre($_credit)) : ( $_credit['url'] ? '<a href="' . $_credit['url'] . '">' : '') . $_credit['nom'] . ( $_credit['url'] ? '</a>' : ''); ?> clearPHP : no-nested-ternary
  • 69.
    Gravé dans lemarbre <?php $ftp_user = 'foo'; $ftp_pass = 'bar'; // Connexion $conn_id = ftp_connect('ftp.example.ca'); // Authentification ftp_login($conn_id, $ftp_user, $ftp_pass); ?> clearPHP : no-hardcoded-credential
  • 70.
    Étrange, étrange <?php class user{ public static countOdd($array) { return count(array_filter( $array, function ($x) { return $x % 2;} ); } } ?> clearPHP : not-a-method
  • 71.
    C'est inutile <?php interface i{ function getI(); } class x implements i { function getI() { return rand(0, 10); } } ?> clearPHP : no-useless-interfaces
  • 72.
    <?php // actually usefulinterfaces function negateI(i $x) { return - $x->getI(); } function sumI(array $a) { $r = 0; foreach($a as $b) { if ($x instanceof i) { $r += $x->getI(); } } return $r; } clearPHP : no-useless-interfaces
  • 73.
    <?php // actually usefulinterfaces function negateI(i $x) { return - $x->getI(); } function sumI(array $a) { $r = 0; foreach($a as $b) { if ($x instanceof i) { $r += $x->getI(); } } return $r; } clearPHP : no-useless-interfaces
  • 74.
    <?php // actually usefulinterfaces function negateI(i $x) { return - $x->getI(); } function sumI(array $a) { $r = 0; foreach($a as $b) { if ($x instanceof i) { $r += $x->getI(); } } return $r; } clearPHP : no-useless-interfaces
  • 75.
  • 76.
  • 77.
    Wordpress Standards no-double-quote Indentation Style d'Accolades Expressionsrégulières no-short-tags Supprimer les espaces terminaux Utilisation des espaces Formatage des requêtes SQL Requêtes de base de données
 (always-prepare-statement) Conventions de nommage Arguments de fonctions compréhensibles [no-nested-ternary] yoda-condition no-implied-if no-noscream know-your-variables
  • 79.
    Bug à lacon <?php $php = 'opendir ('.');'; $y = eval($php); ?> clearPHP : no-double-quotes
  • 80.
    Une référence estun choix no-double-quote no-recalculate no-unused-methods no-useless-interfaces not-a-method
  • 81.
    Sources Manuel PHP Articles dela communauté Bonnes pratiques Commentaires sur le repo de clearPHP
  • 82.
    Faites votre référence Lisezla liste des règles Choisissez vos règles préférées Omettez les règles que vous méprisez Adoptez vos propres règles
  • 83.
    D'autres règles àvenir? Utilisez les typehint (argument et réponse) Créez toujours un constructeur dans une classe East-oriented programming Lavez-vous les mains avant de coder
  • 84.
    Contribuez à clearPHP Nouvellesrègles Discussions sur les règles existantes Traduction en français, chinois ou autre Complément de bibliographie, Exemples et cas particuliers
  • 85.
    Améliorations ? <?php echo ("<p>". $paragraph . "</p>"); ?>
  • 86.
    Améliorations ? <?php echo "<p>". $paragraph . "</p>"; ?> clearPHP : no-parenthesis-for-language-construct
  • 87.
    Améliorations ? <?php echo "<p>",$paragraph, "</p>"; ?> clearPHP : no-unnecessary-string-concatenation
  • 88.
  • 90.
    clearPHP Rules to writegood PHP code Rules to write PHP code Largest list of recommendations Cherry pick your selection
  • 91.
    No one knowswhy Looks like old PHP 4 Bad for performance Bad for security Bad for maintenance Newbie mistake Bad for testing