Page 1 sur 1

A propos de spl_autoload_register

Posté : 22 févr. 2013, 19:57
par YADev
Bonsoir,

Dans une classe qui traite les données d'un formulaire, je dois faire appel à une autre qui se charge elle d'incrémenter la base de donnée après le fameux traitement de celles-ci. Comme chaque classe est dans un fichier qui lui est propre, je voulais savoir si en faisant Maclasse::Incrementation($donnes); spl_autoload_register allait charger le fichier de la classe Maclasse.

Ou si cela ne fonctionnait qu'avec $db = new Maclasse;

Je vous remercie par avance.

Re: A propos de spl_autoload_register

Posté : 22 févr. 2013, 20:09
par Perine
Dès qu'on utilise une classe/interface/trait, l'autoloader se met en marche, quelle que soit la façon dont elle est invoquée.
À noter que tu aurais pu le tester très facilement toi-même en moins d'une minute de cette façon.
spl_autoload_register(function ($class_name) {
    echo $class_name, ' invoquée !', PHP_EOL;
});

ClasseDeTest::test();

Re: A propos de spl_autoload_register

Posté : 22 févr. 2013, 21:46
par zeus
La classe ne sera pas chargée magiquement, non.

Si tu as mis en place un système d'autoloading (via spl_autoload_register()), alors oui, elle sera chargée toute seule, mais si tu n'as que tes 2 classes, aucun système d'autoloading en place, alors non.

Re: A propos de spl_autoload_register

Posté : 28 juin 2013, 22:30
par orenx22
Bonjour,

Voici mon script qui se trouve dans mon index et en tout premier lieu.

// -----------------------------------------------------------------------------
// AUTOLOADER DEFAULT ;

define( 'PATH_ROOT', $_SERVER['DOCUMENT_ROOT'] );

$includes = array(
    PATH_ROOT,
    PATH_ROOT.'/bin',
);

set_include_path( implode( PATH_SEPARATOR, $includes ) );

include_once 'loader.php' ;

spl_autoload_register( array( 'loader', '_class' ) );

Tu peux remplacer le $_SERVER['DOCUMENT_ROOT'] par dirname( __FILE__ ) si tu n'as pas configurer de vhost.

La classe qui est rattaché à l'autoloader et qui est à placer dans un dossier "bin".

class loader
{
    public static function _class( $class_name, $dirs = null )
    {
        $filename = str_replace( '_', DIRECTORY_SEPARATOR, "$class_name.php" );
        
        if( !is_null( $dirs ) )
        {
            $dirs .= DIRECTORY_SEPARATOR . dirname( $filename );
            
            self::_file( basename( $filename ), $dirs, true );
        }
        else
        {
            self::_file( $filename, null, true );
        }
        
        $result = false ;
        
        if( class_exists( $class_name, false ) or interface_exists( $class_name, false ) )
        {
            $result = true ;
        }
        
        return $result ;
    }
    
    public static function _file( $filename, $dirs = null, $once = false )
    {
        $includes = false ;
        
        if( !is_null( $dirs ) )
        {
            $includes = get_include_path();
            
            set_include_path( PATH_ROOT . DIRECTORY_SEPARATOR . $dirs );
        }
        
        if( $once )
        {
            include_once $filename ;
        }
        else
        {
            include $filename ;
        }
        
        if( $includes )
        {
            set_include_path( $includes );
        }
    }
}

Comprend bien qu'avec ce système la nomenclature de tes classes doivent suivre l’arborescence dans la quelles elles sont incluses.

Ciao

Re: A propos de spl_autoload_register

Posté : 29 juin 2013, 15:28
par moogli
salut,

tu ne tiens pas forcément compte des espace de nom dommage.

il y a un "article" sur le sujet dans la partie contribution : vos-contributions/autoload-php-avec-san ... 54834.html


@+