1. Contraintes
C'est possible à la condition de respecter strictement plusieurs choses :
* toutes les PSR doivent être appliquées à la lettre ;
* le langage est toujours à la dernière version ;
* les librairies sont toujours à jour (cela ne doit pas empêcher pas d'être prudent).
2. Démarrer un projet
Nous avons vu que la PSR-1 nous imposait si on faisait de la POO d'utiliser les namespaces.
Même en PHP 8.0, il ne semble pas y avoir d'autoloader par défaut qui puisse nous permettre d'utiliser les différents use.
2.1 Créer un autoload via spl_autoload_register
2.1.1 Créer le fichier autoload.php
On peut créer un fichier autoload.php et y écrire ceci :
<?php
spl_autoload_register(function ($className) {
$className = str_replace('\\', DIRECTORY_SEPARATOR, $className);
$filename = __DIR__ . DIRECTORY_SEPARATOR . $className . '.php';
if (is_readable($filename)) {
require_once($filename);
}
});
2.1.2 Importer l'autoload dans l'index.php
Puis importer ce fichier dans un index.php de la façon suivante :
<?php
require_once('autoload.php');
Après quoi il sera possible dans le fichier index.php d'utiliser des use, eux-mêmes utilisant des use et des namespace.
2.1.3 Exemple d'arborescence
App\
Service\
MyService.php
index.php
autoload.php
Avec MyService.php :
<?php
namespace App\Service;
class MyService
{
public static function myMethod(): string
{
return 'ok';
}
}
et index.php :
<?php
require_once('autoload.php');
use App\Service\MyService;
echo MyService::myMethod();
Attention à bien respecter la PSR-4 : le respect de la casse est indispensable.
2.1.4 Défaut d'un autoload personnel
L'autoload doit être mis à jour dès qu'il y a des nouveautés en terme de PSR et de montée de version du langage.
Par exemple, en PHP 7.0 est introduit la possibilité de faire des use multiples, ce que ne prend pas en compte l'autoload du dessus.
2.2 Utiliser l'autoloader de Composer
Quoi de plus simple que d'utiliser l'autoloader certainement le plus populaire et le plus utilisé du moment ?
2.2.1 On commence par créer le composer.json à la racine de son projet
{
"type": "project",
"license": "MIT",
"autoload": {
"psr-4": {
"App\\": "App/"
}
}
}
Puis on crée un projet via la commande suivante :
composer create-project
Cette commande va générer le dossier vendor et surtout le fichier autoload.php que l'on peut inclure dans son index.php
On peut alors utiliser les uses multiples.
<?php
require ('autoload.php');
use App\Service\{MyClass, MyOther};
MyClass::myMethod();
MyOther::myMethod();
2.2.2 Matcher le namespace App et le dossier src
Si vous souhaitez que toutes les classes définies dans le dossier src de votre projet correspondent au namespace App, il vous faut pour cela modifier la propriété autoload du composer.jon
{
"type": "project",
"license": "MIT",
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
Puis faire une mise à jour de l'autoload via :
composer update
Il est alors possible d'utiliser l'arborescence suivante :
src\
Service\
MyService.php
index.php
autoload.php
En gardant le namespace App.
Cela semble assez antinomique que la PS4 autorise ce type de mapping mais c'est une solution plus souple que de contraindre les namespaces aux noms de dossiers.
2.3 Que faire sans un moteur de template ?
Sur un projet qui n'aurait pas la chance d'avoir un moteur de template évolué (twig/smarty pour les plus connus), on peut éventuellement s'en sortir en faisait quelque chose comme la solution que je présente dans la page sur "les différentes façons de construire une page HTML".