Question

Je suis en train de profiter de autoloading en PHP. J'ai différentes classes dans des répertoires différents, et je l'ai bootstrapped le chargement automatique comme suit:

function autoload_services($class_name)
{
    $file = 'services/' . $class_name. '.php';
    if (file_exists($file))
    {
        require_once($file);
    }
}

function autoload_vos($class_name)
{
    $file = 'vos/' . $class_name. '.php';
    if (file_exists($file))
    {
        require_once($file);
    }
}

function autoload_printers($class_name)
{
    $file = 'printers' . $class_name. '.php';
    if (file_exists($file))
    {
        require_once($file);
    }
}

spl_autoload_register('autoload_services');
spl_autoload_register('autoload_vos');
spl_autoload_register('autoload_printers');

Tout semble fonctionner très bien, mais je voulais juste vérifier que cela est en effet considéré comme une pratique acceptable.

Était-ce utile?

La solution

Bien sûr, semble bon. La seule chose que vous pourriez faire est de les inscrire dans l'ordre où ils sont les plus susceptibles de frapper. Par exemple, si vos plus couramment utilisés sont les classes dans les services, puis, puis imprimantes Vos, l'ordre que vous avez est parfait. En effet, ils sont mis en attente et appelés dans l'ordre, de sorte que vous allez atteindre des performances légèrement meilleures en faisant cela.

Autres conseils

Vous pouvez utiliser:

set_include_path(implode(PATH_SEPARATOR, array(get_include_path(), './services', './vos', './printers')));
spl_autoload_register();

Utilisation spl_autoload_register sans arguments inscriront spl_autoload qui va chercher le nom de classe dans les répertoires du include path . Notez que cela en minuscule le nom de la classe avant de chercher sur le système de fichiers.

Il est correct, mais si ce ne sont que des dossiers ci-dessous un certain dossier, par exemple.

/library
    /JonoB
        /services
        /vos
        /printers

vous voudrez peut-être envisager de les ajouter à votre classnames, par exemple.

JonoB_Services_Foo, JonoB_Vos_Bar, JonoB_Printers_Baz

et puis le partage $classname par le trait de soulignement et de prendre chaque partie comme nom de dossier. Ceci est similaire à PEAR convention nom de classe . De cette façon, vous n'avez qu'un seul chargeur.

Au lieu de classnames de style convention PEAR, vous pouvez également utiliser namespaces ( exemple autoload), mais sachez que ceux-ci ont besoin PHP5.3 qui ne sont pas encore largement disponibles sur l'hébergement mutualisé. Et votre application ne sera pas rétrocompatible avec PHP <5.3 puis (si c'est un problème).

Les bons conseils de toutes les autres réponses.

Permettez-moi d'ajouter que chaque chargeur automatique doit d'abord vérifier si elle même se soucie de la classe étant passés dans et retourner immédiatement sinon.

Donc, si vous faites comme Gordon suggère et ajouter un préfixe à chaque classe, puis pour Services_Foo la autoload_services() autoloader devrait voir si « SERVICES_ » est la première sous-chaîne de $class_name, sinon return false immédiatement pour sauver le tout traitement ultérieur, vérifie en particulier système de fichiers.

Si je devais refactor your code , il serait

function custom_autoload($class_name){
        $dirs = array('services','vos','printers') 
        foreach($dirs as $dir){ 
            $file = $dir.'/'.$class_name. '.php';
            if (file_exists($file)){
               require $file;
               break; // if i have maintained naming conventions as per dir as there
                  // is no point for looking eg: sample1_printer.php in the vos/ 
                 // or printer/. this way iam avoiding unnecessary loop
             }
        }
 }
    spl_autoload_register('custom_autoload');    

Je l'ai écrit mon propre ClassLoader en utilisant spl_autoload_register.
L'avantage est que l'apparence de la fonction dans chaque sous-dossier à partir du dossier en cours.
Je vous suffit d'inclure ce fichier dans tous les fichiers PHP et ne jamais avoir à vous soucier include / require directive.
Il fonctionne simplement: -)

<?php
spl_autoload_register('AutoLoadClasses');

/************************************************************************************
 * AutoLoadClasses
 *
 * Diese Funktion lädt Klassen in gleichnamigen Dateien bei Bedarf automatisch nach,
 * sobald eine (bis dahin unbekannte) Klasse erstmalig instanziert wird.
 * $var = new MeineKlasse; => Es wird nach der Datei class_MeineKlasse.php gesucht
 * Die Suche erfolgt rekursiv in allen Unterordnern ausgehend von dem Ordner, in dem
 * das aufrufende PHP-Script liegt.
 *
 * Michael Hutter / Dezember 2017
 */
function AutoLoadClasses($Klassenname, $StartOrdner = null)
{
    if (is_null($StartOrdner))
    {
        $StartOrdner = __DIR__; # Ausgangspunkt für die Suche: Ordner, in dem sich das aufrufende PHP-Script befindet
        $StartInstanz = true;
    }
    $ZielDateiname = "class_$Klassenname.php";
    $FileList = scandir($StartOrdner, 1); # Sortierung 1 => kommt schneller zum Ziel, falls Ordnernamen im allgemeinen mit einem Großbuchstaben beginnen
    foreach ($FileList as $file) # Alle Dateien und Ordner durchgehen
    {
        $Vollpfad = $StartOrdner.DIRECTORY_SEPARATOR.$file;
        if (is_dir($Vollpfad) && (substr($file, 0, 1) !== '.')) # Ordner?
        {
            #echo "Ordner $StartOrdner<br>";
            $result = AutoLoadClasses($Klassenname, $Vollpfad);
            if ($result) return; # Abbruch, falls Ziel gefunden
        }
        else if (preg_match('/\.php$/i' , $file)) # .php-Datei?
        {
            #echo "$file<br>";
            if ($file == $ZielDateiname) # Dateiname entspricht Klassenname?
            {
                include $Vollpfad;
                return true; # Abbruch aller Rekursionen, da Ziel gefunden
            }
        }
    }
    if (isset($StartInstanz))
        die("<table border bgcolor=red><tr><td>Fehler: Die Datei <b>$ZielDateiname</b> konnte in keinem der Unterordner gefunden werden!</td></tr></table>");
    return false;
}
?>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top