A propos de spl_autoload_register

YADev
Invité n'ayant pas de compte PHPfrance

22 févr. 2013, 19:57

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.

Eléphant du PHP | 120 Messages

22 févr. 2013, 20:09

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();

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

22 févr. 2013, 21:46

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.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 79 Messages

28 juin 2013, 22:30

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

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

29 juin 2013, 15:28

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


@+
Il en faut peu pour être heureux ......