IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

SPL, autoload, namespace et système


Sujet :

Langage PHP

  1. #1
    Rédacteur
    Avatar de Benj.
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2009
    Messages
    839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2009
    Messages : 839
    Points : 1 849
    Points
    1 849
    Par défaut SPL, autoload, namespace et système
    Bonjour,

    j'ai passé pas mal de temps à tenter de comprendre la fonction d'autoload par défaut qu'inclut la SPL (spl_autoload_register/spl_autoload) et son comportement visiblement non portable. Etant fainéant et s'agissant d'un minuscule projet, je ne voulais pas en créer une quand l'implémentation par défaut devait me suffire.

    En effet, première chose à savoir, c'est qu'elle transforme le nom de la classe en minuscules. Donc sous Windows, avec un système insensible à la casse, ce n'est pas vraiment problématique puisqu'on peut ne pas en tenir compte mais je trouve qu'ils auraient dû conserver la casse d'origine, les noms n'en sont que plus lisibles ...

    Le plus drôle, c'est quand on se met à utiliser les espaces de noms. Pour une classe de nom complet Namespace\Classe, PHP va vous chercher namespace\classe.php (ou d'abord .inc, avec les extensions par défaut). Ce qui fait que sous Windows, il faut un sous-dossier namespace (peu importe la casse d'ailleurs) dans un des répertoires figurant dans l'include_path alors que sous Unixoïde, il vous faudra un fichier exactement appelé "namespace\classe.php" (ou .inc, tout en minuscules et avec un beau backslash au milieu) dans l'un des répertoires figurant dans l'include_path.

    Unixoïde :
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    # php -v
    PHP 5.3.1 (cli) (built: Feb  5 2010 18:05:17)
    Copyright (c) 1997-2009 The PHP Group
    Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies
    
    # cat > autoload.php
    <?php
    namespace Developpez;
    
    if (PHP_SAPI != 'cli') {
        header('Content-type: text/plain');
    }
    
    set_include_path('.');
    
    spl_autoload_register();
    
    $f = new FooBar;
    var_dump($f);
    ^D
    
    # cat > developpez\\foobar.php
    <?php
    namespace Developpez;
    
    class FooBar {
        public function __construct() {
            echo __FILE__, PHP_EOL;
        }
    }
    ^D
    
    # ls
    autoload.php  developpez\foobar.php
    
    # php autoload.php
    /home/benj/developpez\foobar.php
    object(Developpez\FooBar)#1 (0) {
    }

    Windows, les mêmes scripts mais organisation différente :
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    > php -v
    PHP 5.3.1 (cli) (built: Nov 19 2009 10:17:43)
    Copyright (c) 1997-2009 The PHP Group
    Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies
    
    > tree /F /A
    C:.
    |   autoload.php
    |
    \---developpez
            foobar.php
    
    > php autoload.php
    C:\dvp>php autoload.php
    C:\dvp\developpez\foobar.php
    object(Developpez\FooBar)#1 (0) {
    }

    Ai-je juste ? Doit-on considérer cela comme un comportement "normal" ? (c'est bien beau de choisir le backslash pour les espaces de nom mais si derrière ce n'est pas cohérent/portable ...)

  2. #2
    Membre éclairé Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Points : 845
    Points
    845
    Par défaut
    Lorsqu'on appelle spl_autoload_register() sans argument, alors une implémentation est utilisée par défaut (spl_autoload).

    Il est fortement conseillé de fournir sa propre implémentation. Car il est vrai que spl_autoload n'est pas namespace-aware.

    Une discussion ici (autoload et namespace):
    http://www.developpez.net/forums/d76...s-espaces-nom/

    Ca fonctionne très bien et c'est portable (tant qu'on respecte la case, mais il n'a pas fallut attendre spl_autoload pour ça).

Discussions similaires

  1. [PHP 5.4] [Namespace] Questions Autoloader
    Par decad7 dans le forum Langage
    Réponses: 4
    Dernier message: 05/08/2014, 15h39
  2. autoload et namespace
    Par loustalet dans le forum Langage
    Réponses: 0
    Dernier message: 11/12/2013, 19h14
  3. Namespace et Autoload
    Par toham dans le forum Langage
    Réponses: 2
    Dernier message: 27/08/2012, 17h25
  4. Système de namespace pour le css
    Par Kels86 dans le forum Mise en page CSS
    Réponses: 0
    Dernier message: 13/06/2012, 15h39
  5. [PHP 5.2] Système d'autoload des fichiers d'inclusions
    Par Aspic dans le forum Langage
    Réponses: 3
    Dernier message: 29/06/2011, 16h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo