Introduction : Pourquoi la documentation est le code que vous écrivez pour vous-même dans un mois
\n\nChaque développeur PHP a déjà été confronté à une situation où son propre code, écrit quelques mois plus tôt, semble étranger et incompréhensible. Au niveau avancé du développement, la documentation cesse d'être de simples commentaires — elle devient une partie de l'architecture du projet, un outil de génération automatique de références API et une base pour le travail en équipe. Dans cet article, nous verrons comment créer une documentation pour les projets PHP qui sera utile non seulement aux débutants, mais aussi aux développeurs expérimentés travaillant avec de grandes bases de code.
\n\nNous parlerons des normes PHPDoc (PSR-5 et PSR-19), des outils de génération automatique (phpDocumentor, Doxygen), ainsi que de la manière de structurer la documentation pour des projets complexes utilisant des interfaces, des traits et des classes abstraites.
\n\nNormes PHPDoc : PSR-5 et PSR-19
\n\nPour une documentation professionnelle PHP, il est nécessaire de respecter les normes adoptées. Les principales sont PSR-5 (PHPDoc) et PSR-19 (PHPDoc Tags). PSR-5 définit la syntaxe et la structure des blocs de documentation, tandis que PSR-19 définit la liste des balises recommandées.
\n\nBalises de base et leur utilisation avancée
\n\nEn plus des balises évidentes @param, @return et @throws, au niveau avancé, on utilise activement :
- \n
- @method — pour décrire les méthodes magiques (
__call,__get); \n - @property — pour décrire les propriétés magiques; \n
- @template — pour la programmation générique (generics); \n
- @implements et @extends — pour indiquer explicitement l'héritage; \n
- @internal — pour marquer le code non destiné à une utilisation externe. \n
<?php\n\n/**\n * @template T of object\n * @implements CollectionInterface<T>\n */\nclass EntityCollection implements CollectionInterface\n{\n /**\n * @param array<int, T> $items\n */\n public function __construct(\n private array $items = []\n ) {}\n\n /**\n * @return T|null\n */\n public function first(): ?object\n {\n return $this->items[0] ?? null;\n }\n\n /**\n * @method void sortBy(string $field)\n * @method T get(int $index)\n */\n public function __call(string $name, array $arguments): mixed\n {\n // Implémentation de la méthode magique\n }\n}\n\n\nTypage dans PHPDoc : du simple au complexe
\n\nUne documentation avancée nécessite une description précise des types. Utilisez :
\n\n- \n
array<int, string>— tableau associatif; \n Collection<User>— collection d'objets; \n Closure(User): bool— fermeture avec description des arguments et du retour; \n class-string<User>— chaîne contenant le nom de la classe. \n
Exemple de documentation bien rédigée pour une méthode complexe :
\n\n/**\n * Filtre la collection d'utilisateurs selon une condition donnée.\n *\n * @param Closure(User): bool $callback Fonction de filtre\n * @return static<User> Nouvelle collection avec les éléments filtrés\n *\n * @throws InvalidArgumentException si le callback n'est pas callable\n *\n * @example\n * $admins = $users->filter(fn(User $u) => $u->isAdmin());\n */\npublic function filter(Closure $callback): static\n{\n // ...\n}\n\n\nGénération automatique de documentation : phpDocumentor et Doxygen
\n\nMaintenir manuellement la documentation à jour est une tâche qui devient rapidement insurmontable. Les outils de génération automatique permettent de créer une documentation HTML, PDF ou Markdown directement à partir des blocs PHPDoc.
\n\nphpDocumentor (phpdoc)
\n\nL'outil le plus populaire pour PHP. Installation via Composer