[PHP] Autoload

Résolu/Fermé
Autumn`Tears Messages postés 1054 Date d'inscription samedi 14 mars 2009 Statut Membre Dernière intervention 23 octobre 2013 - 22 juin 2012 à 21:49
aladin07 Messages postés 277 Date d'inscription vendredi 13 avril 2012 Statut Membre Dernière intervention 30 septembre 2012 - 26 juin 2012 à 20:27
Bonjour,

J'essaie de comprendre le fonctionnement d'autoload, mais sans véritable succès...
Comment l'implémenter, comment s'en servir, etc.
Si vous avez un peu de temps à partager pour m'éclairer un peu dans ce domaine, merci.


A voir également:

2 réponses

aladin07 Messages postés 277 Date d'inscription vendredi 13 avril 2012 Statut Membre Dernière intervention 30 septembre 2012 30
Modifié par aladin07 le 24/06/2012 à 15:43
Et bien parfois on charge beacoup de classes dans un fichier php, au lieu de les inclure une à une on utilise __autoload().

Par exemple si tu as un dossier libraries/ tu pourras inclure automatiquement toutes les classes que tu veux sans inclure manuelement les fichiers. Les fichiers seront inclus au moment ou tu appels ta classe.

<?php 
/* Au lieu de 
inclue 'libraries/mailer.php'; 
inclue 'libraries/zip.php'; 
inclue 'libraries/themes.php'; 
 ...etc.*/ 

function __autoload($name) 
{ 
    include 'libraries/'.$name.'.php'; 
} 

$mail = new Mail(); 
$zip = new Zip(); 
$themes = new Themes();


Le nom du fichier qui contient la classe doit être IDENTIQUE au nom de la classe
new MyClass va inclure MyClass.php

Encore mieux, utiliser la fonction spl_autoload_register();

Selons php.net __autoload() pourrait être déprecié dans le future, donc il vaut mieux s'habituer à spl_autoload_register()

spl_autolaod_register() a le même principe que __autoload(), sauf que la première utilise un fonction déjà défini par exemple:
<?php 

/* Disons qu'on a deux dossiers qui contiennent des classes. 
Dans le premier les libraries et dans le deuxième les models (dans un MVC) 

On assume que les fichiers contenants les classes sont en minuscules 
*/ 

function my_autoload($name) { 
    //Chercher dans le dossier libraries
    file_exists($file = 'libraries/'.strtolower($name).'.php') 
    // Ou dans le dossier models
    OR file_exists($file = 'models/'.strtolower($name).'.php');
    
    // Si le fichier existe dans libraries $file récupere 
    // 'libraries/'.strtolower($name).'.php' 
    // sinon elle récupere 'models/'.strtolower($name).'.php'
    include $file; 
} 

spl_autoload_register('my_autoload'); 

$class = new MyClass(); 


Ceci va chercher dans le dossier libraries puis dans le dossier models les fichiers en minuscule. new MyClass va include myclass.php

Si tu as une question n'hésite pas.
Aladin.
1
Autumn`Tears Messages postés 1054 Date d'inscription samedi 14 mars 2009 Statut Membre Dernière intervention 23 octobre 2013 145
26 juin 2012 à 18:12
Salut,

Et merci pour ta réponse !

La seule limite à ça, c'est lorsque la classe n'est pas définie par le même nom que le fichier finalement.
0
aladin07 Messages postés 277 Date d'inscription vendredi 13 avril 2012 Statut Membre Dernière intervention 30 septembre 2012 30
26 juin 2012 à 20:27
Et bien justement!

Tu peux mettre un truc du genre:

function my_auotoload($name)
{
if($name == 'Hello') include 'libraries/myclassname.php';
else include $name.'.php';
}

Tu peux modifier la logique de ta fonction comme tu veux
0
L'exemple de la doc est plutôt parlant, non ?
http://php.net/autoload

Si la définition d'une classe n'est pas connue, autoload est une solution pour permettre de charger sa définition au moment où on en a besoin.

<?php
function __autoload($class_name) {
include $class_name . '.php';
}

$obj = new MaClasse1();
$obj2 = new MaClasse2();
0