La référence Clear php

Preview:

Citation preview

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