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) :wink:

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

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!