Bonnes pratiques et Approfondissement PHP Objet

Jean-Marc Lecarpentier
GREYC — Université de Caen

Bonnes pratiques

Wikipédia : Le terme « bonnes pratiques » désigne, dans un milieu professionnel donné, un ensemble de comportements qui font consensus et qui sont considérés comme indispensables par la plupart des professionnels du domaine, qu'on peut trouver sous forme de guides de bonnes pratiques (GBP).

Utilisées dans de nombreux domaines : médical, agricole, etc.

Informatique : exemple de l'accessibilité (Web Content Accessibility Guidelines)

En programmation, les bonnes pratiques facilitent l'échange de code, sa compréhension et sa réutilisation.

Bonnes pratiques indépendantes du langage

Éviter les classes trop « grosses »

Bien choisir les noms de variables, fonctions, classes, méthodes, etc.

Garder les méthodes « petites » (en nombre de lignes de code)

Commenter son code

Être cohérent dans son style de code et utiliser le style de code standard

Source : Writing Good Java Code

Style de code

Bonnes pratiques pour la rédaction de code

Conventions dépendant du langage utilisé

Exemple en Python :
import os
import sys
et non
import sys, os
Exemple en Java :
public static void main(String[] args) {
}
et non
public static void main(String[] args)
    {
    }

Des règles devenues communes : UTF-8, indentation 4 espaces, etc.

Règles de nommages diffèrent selon les langages (snake_case, camelCase, etc)

Bonnes pratiques en PHP

PHP Framework Interop Group composé de Framework, CMS, etc

Groupes de travail produisent les PSR (PHP Standard Recommendation)

PSR : document représentant un consensus sur les règles à adopter

Intérêt de respecter les PSR : interopérabilité, lisibilité du code (mêmes look & feel dans tous les projets), rédaction simplifiée

Règles de présentation du code : PSR 2 Codign Style Guide

Validation du code : PHP Code Sniffer

Nettoyer son code : PHP Coding Standards Fixer

Configurer son éditeur correctement

Namespaces PHP

Permettre d'utiliser un même nom pour une classe ou fonction mais dans des espaces différents

Créer des alias pour avoir des noms plus courts dans son code

Similitudes avec la notion de package en Java

Structure hiérarchique en PHP (penser à l'arborescence d'un système de fichiers)

Utilisable pour les constantes, fonctions et classes

Syntaxe :
    namespace MyProject\Sub\Level;        

Bonne pratique : un seul namespace par fichier

Utilisation

Définition :
namespace Appli\Exemple;

const 
MYCONST 'Une  constante dans le namespace défini';

function 
MyFunction() 
{
    return 
"Une fonction dans le namespace " __NAMESPACE__;
}

class 
MyClass 
{
    public function 
hello() 
    {
        return 
"Hello venant du namespace " __NAMESPACE__;
    }
}
Utilisation dans le namespace global :
echo Appli\Exemple\MYCONST;

echo 
Appli\Exemple\MyFunction();

$myClass = new Appli\Exemple\MyClass();;
echo 
$myClass->hello();;

// appel d'une fonction du namespace global
echo strlen('la longuer de cette chaine');

// appel d'une classe du namespace global
$date = new Date();;
Utilisation dans le namespace défini :
namespace Appli\Exemple;

echo 
MYCONST;

echo 
MyFunction();

$myClass = new MyClass();;
echo 
$myClass->hello();;

// appel d'une fonction du namespace global
echo \strlen('la longuer de cette chaine');

// appel d'une classe du namespace global
$date = new \Date();;

Import et alias

Possibilité d'importer des namespaces :
 namespace MyProject\Sub\Level
 use \
Unicaen\Ldap\Connector
 use \
LdapProjet\LdapService\Connector as LdapConnector;

Voir les règles de résolution de noms

Autochargement de classes

Objectif : ne plus avoir à écrire les require_once au début de chaque fichier

Moyen : définir une (ou plusieurs) fonction(s) déterminant quel fichier inclure en fonction du nom de classe

Fonction spl_autoload_register (documentation) pour définir une fonction ou classe/méthode qui sera appelée à chaque appel à une classe pour laquelle la déclaration n'a pas encore été lue par PHP.

Cette fonction reçoit en argument le nom complet de la classe utilisée et doit faire le mapping avec le fichier à inclure

Namespaces, chargement de classes et bonnes pratiques

Un namespace doit commencer par un vendor name

PSR 4 Autoloader définit les mappings

Isomorphisme entre (sous-)namespaces et dossiers

Interfaces et classes abstraites

Interface : écriture d'un contrat pour définir les signatures des méthodes de classes

Définition
 namespace Jml\Poem
 interface 
PoemInterface

Règle de nommage : suffixe Interface

Classe abstraite : abtraction et factorisation de code

Définition
 namespace Jml\Poem
 abstract class 
AbstractPoem

Règle de nommage : préfixe Abstract

Type Hinting

Possibilité d'indiquer à une fonction ou méthode le type attendu en argument

Uniquement pour les classes (PHP 5)

Aussi pour les scalaires (PHP 7)

Utile pour le débuggage : Warning si l'argument n'est pas du type attendu

Utile pour les IDE pour vérifier la syntaxe et auto-compléter les méthodes

Conclusion

Rigueur dans l'écriture du code

Rigueur dans le nommage des classes et fichiers

Meilleure lisibilté de votre projet PHP

Partage de code simplifié