Texte
a référence clearPHPMontré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 programmationSymfony
Wordpress
Drupal
Typo3
Atoum
CakePHP
PEAR
PSR
Rafael Dohms
…
Wordpress StandardsSimple 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 StandardsSimple 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 StandardsSimple 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 StandardsSimple 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 StandardsSimple 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 StandardsSimple 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 StandardsSimple 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 StandardsSimple 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 e
n 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 site\n";} 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?<?phpswitch (file_get_contents($uri)) { case false :// code1case '' :// code2default :// 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 marcheArray( [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 (\Classe\Inexistante $e) {
} catch (\Pas\Une\Exception $e) {
}
clearPHP : no-unresolved-catch
C'est toujours la même chose<?php
try {
} catch (\Classe\Inexistante $e) {
} catch (\Pas\Une\Exception $e) {
}
Ceci est du code mort
clearPHP : no-unresolved-catch
C'est toujours la même chose<?php
try {
} catch (\Classe\Inexistante $e) {
} catch (\Pas\Une\Exception $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 \Une\Classe) { $y = $x->convert();}
?>
clearPHP : no-unresolved-instanceof
C'est toujours la même chose
<?php
if ($x instanceof \Une\Classe) { $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');// Authentificationftp_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 interfacesfunction 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 interfacesfunction 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 interfacesfunction 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
clearPHPNom
Explications
Exemples
Quand l'éviter
Bibliographie
En Français dans le texte
Wordpress Standardsno-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 choixno-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érenceLisez 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 à clearPHPNouvelles 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, [email protected], 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
Top Related