Skip to content

Latest commit

 

History

History
156 lines (117 loc) · 4.84 KB

tut5-complement.md

File metadata and controls

156 lines (117 loc) · 4.84 KB
title subtitle layout lang
Configuration Apache, namespace et autoloader
tutorial
fr

.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 :

  • il faut paramétrer Apache pour utiliser les fichiers .htaccess. Pour ceci, il faut modifier le fichier apache2.conf pour transformer les lignes AllowOverride none en AllowOverride All.
  • Votre version d'Apache n'est peut-être pas assez récente. La directive donnée dans le TD5 nécessite une version d'Apache ≥ 2.4. Dans ce cas, utilisez les fichiers .htaccess suivant
    <IfVersion < 2.4>
      Deny from all
    </IfVersion>
    <IfVersion >= 2.4>
        Require all denied
    </IfVersion>
    et
    <IfVersion < 2.4>
      Allow from all
    </IfVersion>
    <IfVersion >= 2.4>
        Require all granted
    </IfVersion>
    Note : La version d'Apache peut se voir dans les en-têtes de réponse HTTP. Utilisez l'outil de développement Network pour y accéder.

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

  • file1.php
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";
    }
}
  • file2.php
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 :

  • il n'utilise pas de programmation orientée-objet,
  • il ne permet d'associer qu'un seul préfixe de nom de classe qualifié à un chemin de fichier.

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.