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 ...)
Partager