Page 1 sur 2
namespace et spl_autoload
Posté : 03 juin 2010, 02:06
par Grummfy
Hello,
j'ai entendu dire que les namespace était supporter par spl_autoload. Mais d'après mes test cela ne semble pas le cas.
Quelqu'un peut-il m'en dire plus?
Auriez-vous des implémentation de spl_autoload pour pallier a ce problème?
Re: namespace et spl_autoload
Posté : 03 juin 2010, 13:36
par stealth35
t'as bien mis le namespace dans tes class ?
Re: namespace et spl_autoload
Posté : 03 juin 2010, 14:45
par Grummfy
Oui (si j'inclus le fichier manuellement, cela ne pause aucun problème)
je ne sais pas si cela joue, mais je suis sous linux
Re: namespace et spl_autoload
Posté : 03 juin 2010, 14:59
par stealth35
pour tester
index.php
use My\Framework\Test;
spl_autoload_register();
$test = new Test();
echo $test;
My/Framework/Test.php
namespace My\Framework;
class Test
{
public function __toString()
{
return 'hi';
}
}
Re: namespace et spl_autoload
Posté : 03 juin 2010, 15:08
par Grummfy
si je test ton exemple j'obtiens ceci :
Fatal error: spl_autoload() [<a href='function.spl-autoload'>function.spl-autoload</a>]: Class My\Framework\Test could not be loaded in /.../index.php on line 7
Mais si je fait un include de My/Framework/Test.php alros cela passe
Si je supprime le use mais en mettant le include, alors il me remet l'erreur spl (logique car pas dans le même namespace.
=> le namespace fonctionne mais pas l'autoload.
Pourtant partout je lit que l'implémentation par défaut de spl_autolaod est prévue pour supporter les namespace...
Re: namespace et spl_autoload
Posté : 03 juin 2010, 15:14
par stealth35
bizarre chez moi ca marche
si t'essaye comme ca
use My\Framework\Test;
spl_autoload('My\Framework\Test');
$test = new Test();
echo $test;
ou comme ca
spl_autoload('My\Framework\Test');
$test = new My\Framework\Test();
echo $test;
les 2 marchent chez moi (5.3.2, xp)
avec
-- index.php
-- My
-- -- Framework
-- -- -- Test.php
Re: namespace et spl_autoload
Posté : 03 juin 2010, 15:28
par Grummfy
le premier :
Fatal error: Uncaught exception 'LogicException' with message 'Class My\Framework\Test could not be loaded' in /.../index.php:14 Stack trace: #0 /.../index.php(14): spl_autoload('My\Framework\Te...') #1 {main} thrown in /.../index.php on line 14
Le deuxième :
Fatal error: Uncaught exception 'LogicException' with message 'Class My\Framework\Test could not be loaded' in /.../index.php:21 Stack trace: #0 /.../index.php(12): spl_autoload('My\Framework\Te...') #1 {main} thrown in /.../index.php on line 21
Je me demande si ce ne serait pas simplement du au fait que sous windows le directory_separator est "\" et sous unix "/" => de ce fait sous windows cela chargerait
Donc pour info : linux (ubuntu 10.04 - 64bit) et PHP 5.3.2
Re: namespace et spl_autoload
Posté : 03 juin 2010, 15:31
par stealth35
je sais pas puisque que le séparateur de namespace c'est \ ducoup ca prête a confusion, je testerais ce soir sur mon mac pour voir
Re: namespace et spl_autoload
Posté : 03 juin 2010, 15:34
par stealth35
t'essayes tout dans un même fichier ? (vus le numéro de ligne des erreurs)
Re: namespace et spl_autoload
Posté : 03 juin 2010, 15:48
par Grummfy
oui (donc 2 fichiers : index.php et My/Framework/Test.php).
Mais je commente à chaque fois -> cela me permet de garder les différents test réalisé sous la main
Re: namespace et spl_autoload
Posté : 03 juin 2010, 15:52
par stealth35
oui (donc 2 fichiers : index.php et My/Framework/Test.php).
Mais je commente à chaque fois -> cela me permet de garder les différents test réalisé sous la main
spé, je testerai ce soir je te redirai (sauf si tu trouves avant)

Re: namespace et spl_autoload
Posté : 03 juin 2010, 18:53
par stealth35
marche pas sur le mac non plus
je pense que comme tu dis c'est a cause des séparateur si on fait comme ca ca marche (mais c'est naze)
use My\Framework\Test;
function my_autoload($class)
{
$class = str_replace('\\', DIRECTORY_SEPARATOR, $class);
spl_autoload($class);
}
spl_autoload_register('my_autoload');
$test = new Test();
echo $test;
Re: namespace et spl_autoload
Posté : 03 juin 2010, 18:58
par Grummfy
bon ben je sens que je vais aller faire un rapport de bug ...
Re: namespace et spl_autoload
Posté : 03 juin 2010, 19:00
par stealth35
bon ben je sens que je vais aller faire un rapport de bug ...
http://www.php.net/manual/fr/function.s ... .php#92767
any configuration 
Re: namespace et spl_autoload
Posté : 03 juin 2010, 19:21
par Grummfy
je sais mais si tu arrive a le faire fonctionner bravo ...
sur ce je termine mon bug report ...
---------------------
http://bugs.php.net/bug.php?id=51991
edit, pour ceux que cela intéresserait : ceci fonctionne :
Code : Tout sélectionner
//http://groups.google.com/group/php-standards/web/psr-0-final-proposal
function autoload($className)
{
$className = ltrim($className, '\\');
$fileName = '';
$namespace = '';
if ($lastNsPos = strripos($className, '\\'))
{
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
$fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
}
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
require $fileName;
}
spl_autoload_register('autoload');
-------------
yeah, bug corriger .... =>
http://svn.php.net/viewvc/?view=revisio ... ion=300176 ça c'est rapide!