Configuration Apache, namespace et autoloader

.htaccess

Fichier permettant de paramétrer Apache

Pourquoi est-ce que les ACL ne permettent pas de faire notre comportement ?

On veut qu’Apache puisse exécuter tous les scripts PHP, donc on ne peut pas toucher les ACL. Par contre, il ne doit pas répondre à certaines requêtes, donc on a besoin du fichier .htaccess.

Si le fichier .htaccess ne marche pas

Normalement, les fichiers .htaccess marchent à l’IUT sur webinfo, et dans une installation classique de XAMP sous Linux.

Cependant, si cela ne marche pas sur votre installation, voici 2 pistes de solution :

namespace

Les espaces de noms permettent d’encapsuler des classes, fonctions pour éviter les conflits. Ils fonctionnent de manière similaire aux fichiers qui sont répartis dans des dossiers.

Source : Documentation sur PHP.net

namespace

namespace EspaceBase\SousEspace;

class Foo
{
    static function methodestatique() {
      echo "Methode statique de Foo dans file1.php\n";
    }
    function methode() {
      echo "Methode dynamique de Foo dans file1.php\n";
    }
}
namespace EspaceBase;
include 'file1.php';

class Foo
{
    static function methodestatique() {
      echo "Methode statique de Foo dans file2.php\n";
    }
    function methode() {
      echo "Methode dynamique de Foo dans file2.php\n";
    }
}

/* nom non qualifié */
$f = new Foo(); // Classe \EspaceBase\Foo
$f->methode(); // Affiche "Methode dynamique de Foo dans file2.php"
Foo::methodestatique(); // Affiche "Methode statique de Foo dans file2.php"

/* nom qualifié */
$f = new SousEspace\Foo(); // Classe \EspaceBase\SousEspace\Foo
$f->methode(); // Affiche "Methode dynamique de Foo dans file1.php"
SousEspace\Foo::methodestatique(); // Affiche "Methode statique de Foo dans file1.php"

/* nom absolu */
$f = new \EspaceBase\SousEspace\Foo(); // Classe \EspaceBase\SousEspace\Foo
$f->methode(); // Affiche "Methode dynamique de Foo dans file1.php"
\EspaceBase\SousEspace\Foo::methodestatique(); // Affiche "Methode statique de Foo dans file1.php"

Source : Documentation sur PHP.net

Accès aux classes, fonctions et constantes globales depuis un espace de noms

namespace Foo;

function strlen() {}
const INI_ALL = 3;
class Exception {}

$a = \strlen('hi'); // appel la fonction globale strlen
$b = \INI_ALL; // accès à une constante INI_ALL
$c = new \Exception('error'); // instantie la classe globale Exception

Source : Documentation sur PHP.net

Explication de l’implémentation de l’autoloader

spl_autoregister

La fonction spl_autoregister est le cœur du mécanisme de chargement automatique de classes de PHP. On lui donne en argument une fonction qui sera appelée si PHP rencontre une classe qui n’a pas encore été déclarée.

La méthode register() de Psr4AutoloaderClass ne fait qu’enregistrer la méthode Psr4AutoloaderClass::loadClass() avec un appel à spl_autoregister.

Le reste de la classe transforme un nom de classe qualifié en un nom de fichier (méthode loadMappedFile), puis charge le fichier avec requireFile.

Exemple plus simple

Vous pouvez voir un exemple plus court d’autoloader à cette adresse. Attention, cet exemple n’est pas recommandé car :

Pas d’autoloader pour les vues ?

Pourquoi n’utilise-t-on pas l’autoloader pour charger les vues ? Parce que l’autoloader charge automatique des classes. Or les vues ne sont pas des classes PHP.