91
Texte a référence clearPHP Montréal, Québec, Canada. July 23rd 2015 L

La référence Clear php

Embed Size (px)

Citation preview

Page 1: La référence Clear php

Texte

a référence clearPHPMontréal, Québec, Canada. July 23rd 2015

L

Page 2: La référence Clear php

Agenda

La référence clearPHP

Entièrement PHP

Faites la votre

Page 3: La référence Clear php

Intervenant

Damien Seguy

CTO chez exakat

Français canadien canadien français

Services de revue de code automatique

Page 4: La référence Clear php

Ca marche, ça?<?php

function f($a, $a, $a) { echo $a;}

f('b', 'c', 'd');

?>

clearPHP : all-unique-arguments

Page 5: La référence Clear php

Ca marche, ça?<?php

function f($a, $a, $a) { echo $a;}

f('b', 'c', 'd');

?> KO en PHP 7

clearPHP : all-unique-arguments

Page 6: La référence Clear php

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

Page 7: La référence Clear php

Standards de programmationSymfony

Wordpress

Drupal

Typo3

Atoum

CakePHP

PEAR

PSR

Rafael Dohms

Page 8: La référence Clear php

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()

Page 9: La référence Clear php

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()

Page 10: La référence Clear php

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()

Page 11: La référence Clear php

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()

Page 12: La référence Clear php

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()

Page 13: La référence Clear php

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()

Page 14: La référence Clear php

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()

Page 15: La référence Clear php

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()

Page 16: La référence Clear php

Convention de code

Conception

Référence de programmation PHP

Page 17: La référence Clear php

Pièges classiques en PHP

Page 18: La référence Clear 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

Page 19: La référence Clear php

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

Page 20: La référence Clear php

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

Page 21: La référence Clear php

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

Page 22: La référence Clear php

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

Page 23: La référence Clear php

Où ça, une erreur?<?phpswitch (file_get_contents($uri)) { case false :// code1case '' :// code2default :// code3

}?>

clearPHP : strict-comparisons

Page 24: La référence Clear php

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

Page 25: La référence Clear php

Et pourtant, ça marcheArray( [0] => a [1] => d)Array( [0] => c [1] => d)

clearPHP : no-dangling-reference

Page 26: La référence Clear php

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

Page 27: La référence Clear php

C'est bien la même chose<?php

$x = true;$y = false;

$z1 = $x and $y;$z2 = $x && $y;

?>

clearPHP : no-letter-logical

Page 28: La référence Clear php
Page 29: La référence Clear php
Page 30: La référence Clear php
Page 31: La référence Clear php
Page 32: La référence Clear php

C'est toujours la même chose<?php

try {

} catch (\Classe\Inexistante $e) {

} catch (\Pas\Une\Exception $e) {

}

clearPHP : no-unresolved-catch

Page 33: La référence Clear php

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

Page 34: La référence Clear php

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

Page 35: La référence Clear php

C'est toujours la même chose<?php

namespace X;try {

} catch (Exception $e) {

}

?>clearPHP : no-unresolved-catch

Page 36: La référence Clear php

C'est toujours la même chose<?php

namespace X;try {

} catch (Exception $e) {

}

?> Encore du code mort

clearPHP : no-unresolved-catch

Page 37: La référence Clear php

C'est toujours la même chose

<?php

if ($x instanceof \Une\Classe) { $y = $x->convert();}

?>

clearPHP : no-unresolved-instanceof

Page 38: La référence Clear php

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

Page 39: La référence Clear php

Performances

Page 40: La référence Clear php

Ça rame<?php

define('DAY_IN_SECONDS', 24 * 60 * 60);

define('DAY_IN_SECONDS', 86400);

const DAY_IN_SECONDS = 86400;

?>

clearPHP : always-preprocess

Page 41: La référence Clear php

Ça rame<?php

define('DAY_IN_SECONDS', 24 * 60 * 60);

define('DAY_IN_SECONDS', 86400);

const DAY_IN_SECONDS = 86400;

?>

clearPHP : always-preprocess

Page 42: La référence Clear php

Ça rame<?php

define('DAY_IN_SECONDS', 24 * 60 * 60);

define('DAY_IN_SECONDS', 86400);

const DAY_IN_SECONDS = 86400;

?>

clearPHP : always-preprocess

Page 43: La référence Clear php

Ça rame<?php

$x = [];$x['id'] = 0;$x['username'] = 'bibi';$x['creation'] = time();

?>

clearPHP : always-preprocess

Page 44: La référence Clear php

Ça rame<?php

$x = [];$x['id'] = 0;$x['username'] = 'bibi';$x['creation'] = time();

?>

clearPHP : always-preprocess

<?php $x = [ 'id' => 0, 'username' => 'bibi', 'creation' => time(), ];

?>

Page 45: La référence Clear php

Ça rame

<?php

echo "<p>";echo $paragraphe;echo "</p>";

?>

clearPHP : no-repeated-print

Page 46: La référence Clear php

Ça rame<?php

$array = $source->fetchData();$array = array_unique($array);

?>

clearPHP : avoid-those-slow-functions

Page 47: La référence Clear php

Ç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));

?>

Page 48: La référence Clear php

Ç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

Page 49: La référence Clear php

Ç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

Page 50: La référence Clear php

Trucs PHP

Page 51: La référence Clear php

C'est pas logique<?php

switch ($x) { default : // something useful break; default : // something else and useful break; }

clearPHP : no-switch-with-multiple-default

Page 52: La référence Clear php

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

Page 53: La référence Clear php

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

Page 54: La référence Clear php

C'est pas logique<?php

switch ($x) { case 1 : // something useful break; case 1 : // something useful break; }

clearPHP : no-duplicate-case

Page 55: La référence Clear php

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

Page 56: La référence Clear php

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

Page 57: La référence Clear php

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

Page 58: La référence Clear php

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

Page 59: La référence Clear php

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

Page 60: La référence Clear php

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

Page 61: La référence Clear php

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

Page 62: La référence Clear php

Surtout pas!

<?php

$content = @file_get_contents($uri);

?>

clearPHP : no-noscream

Page 63: La référence Clear php

C'est pas possible!<?php

class user { public static getName() {

return $this->name; }}

?>

clearPHP : no-static-this

Page 64: La référence Clear php

C'est pas possible!<?php

class user { public static getName() {

return $this->name; }}

?>

clearPHP : no-static-this Toujours en PHP 7

Page 65: La référence Clear php

Pas spécifique à PHP

Page 66: La référence Clear 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

Page 67: La référence Clear 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

Page 68: La référence Clear 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

Page 69: La référence Clear php

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

Page 70: La référence Clear php

Étrange, étrange<?php

class user { public static countOdd($array) {

return count(array_filter($array,

function ($x) { return $x % 2;});

}}?>

clearPHP : not-a-method

Page 71: La référence Clear php

C'est inutile<?php

interface i { function getI(); }

class x implements i {function getI() { return rand(0, 10); }}

?>

clearPHP : no-useless-interfaces

Page 72: La référence Clear php

<?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

Page 73: La référence Clear php

<?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

Page 74: La référence Clear php

<?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

Page 75: La référence Clear php

clearPHP

https://github.com/dseguy/clearPHP

114 règles de bonne programmation PHP

Page 76: La référence Clear php

clearPHPNom

Explications

Exemples

Quand l'éviter

Bibliographie

En Français dans le texte

Page 77: La référence Clear php

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

Page 78: La référence Clear php
Page 79: La référence Clear php

Bug à la con

<?php

$php = 'opendir ('.');';$y = eval($php);

?>

clearPHP : no-double-quotes

Page 80: La référence Clear php

Une référence est un choixno-double-quote

no-recalculate

no-unused-methods

no-useless-interfaces

not-a-method

Page 81: La référence Clear php

Sources

Manuel PHP

Articles de la communauté

Bonnes pratiques

Commentaires sur le repo de clearPHP

Page 82: La référence Clear php

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

Page 83: La référence Clear php

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

Page 84: La référence Clear php

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

Page 85: La référence Clear php

Améliorations ?

<?php

echo ("<p>" . $paragraph . "</p>");

?>

Page 86: La référence Clear php

Améliorations ?

<?php

echo "<p>" . $paragraph . "</p>";

?>

clearPHP : no-parenthesis-for-language-construct

Page 87: La référence Clear php

Améliorations ?

<?php

echo "<p>", $paragraph, "</p>";

?>

clearPHP : no-unnecessary-string-concatenation

Page 88: La référence Clear php

Texte

Thanks!@faguo, [email protected], https://github.com/dseguy/clearPHP

Page 89: La référence Clear php
Page 90: La référence Clear php

clearPHP

Rules to write good PHP code

Rules to write PHP code

Largest list of recommendations

Cherry pick your selection

Page 91: La référence Clear php

No one knows why

Looks like old PHP 4

Bad for performance

Bad for security

Bad for maintenance

Newbie mistake

Bad for testing