La meilleure façon D'accéder aux Classes Autoload en PHP

je travaille sur un projet dans lequel j'ai la structure de fichier suivante:

index.php
|---lib
|--|lib|type|class_name.php
|--|lib|size|example_class.php

j'aimerais charger automatiquement les classes, class_name et example_class (nommées de la même façon que les classes PHP), de sorte que dans index.php les classes seraient déjà instanciées donc je pourrais faire:

$class_name->getPrivateParam('name');

j'ai eu un coup d'oeil sur le net, mais n'arrive pas à trouver la bonne réponse - quelqu'un peut-il m'aider?

EDIT

Merci pour les réponses. Permettez-moi de développer mon scénario. Je suis en train d'essayer D'écrire un plugin WordPress qui peut être abandonné dans un projet et des fonctionnalités supplémentaires ajoutées en laissant tomber une classe dans un dossier "fonctionnalité" par exemple, à l'intérieur du plugin. Il n'y aura jamais 1000 cours, à une poussée peut-être 10?

je pourrais écrire une méthode pour itérer à travers la structure des dossiers du dossier' lib', y compris chaque classe puis l'assigner à une variable( du nom de la classe), mais je ne pense pas que ce soit une façon très efficace de le faire, mais il semble peut-être c'est la meilleure façon d'obtenir ce dont j'ai besoin?

19
demandé sur Sjwdavies 2013-07-23 13:24:51

5 réponses

s'il vous Plaît, si vous avez besoin d'auto-chargement des classes - utiliser les espaces de noms et les noms de classe conventions avec autoload SPL, il permettra d'économiser votre temps pour le refactoring. Et bien sûr, vous aurez besoin d'instancier chaque classe comme un objet. Remercier.

Comme dans ce fil: PHP Chargement automatique dans les espaces de noms

mais si vous voulez une solution complexe, s'il vous plaît jeter un oeil à Symfony autoload classe: https://github.com/symfony/ClassLoader/blob/master/ClassLoader.php

Ou comme ça (je l'ai fait dans un de mes projets):

<?
spl_autoload_register(function($className)
{
    $namespace=str_replace("\","/",__NAMESPACE__);
    $className=str_replace("\","/",$className);
    $class=CORE_PATH."/classes/".(empty($namespace)?"":$namespace."/")."{$className}.class.php";
    include_once($class);
});
?>

et puis vous pouvez instancier ta classe comme ceci:

<?
$example=new NS1\NS2\ExampleClass($exampleConstructParam);
?>

et c'est votre classe (trouvée dans /NS1/NS2/ExampleClass.classe.php):

<?
namespace NS1\NS2
{
    class Symbols extends \DB\Table
    {
        public function __construct($param)
        {
            echo "hello!";
        }
    }
}
?>
29
répondu Serge Velikanov 2017-05-23 12:26:25

si vous avez un accès à la ligne de commande, vous pouvez l'essayer avec composer dans la section classMap avec quelque chose comme ceci:

{
    "autoload": {
        "classmap": ["yourpath/", "anotherpath/"]
    }
}

alors vous avez un plugin wordpress pour activer composer dans le clip wordpress:http://wordpress.org/plugins/composer/

10
répondu lilobase 2013-07-23 09:49:20
function __autoload($class_name) {
   $class_name = strtolower($class_name);
   $path       = "{$class_name}.php";
   if (file_exists($path)) {
       require_once($path);
   } else {
       die("The file {$class_name}.php could not be found!");
   }
}

mise à jour: __autoload() est obsolète depuis PHP 7.2

4
répondu Hassan Azimi 2017-07-17 14:53:13

http://php.net/manual/de/function.spl-autoload-register.php

spl_autoload_register(function ($class) {
    @require_once('lib/type/' . $class . '.php');   
    @require_once('lib/size/' . $class . '.php');
});
3
répondu DanFromGermany 2013-07-23 09:27:30

j'ai ici un exemple que j'utilise pour l'autoloading et l'initilization.

Fondamentalement une meilleure version de spl_autoload_register puisqu'il ne cherche à requérir le fichier de classe que lorsque vous initialisez la classe.

Ici, il reçoit automatiquement chaque fichier à l'intérieur de votre dossier de classe, nécessite les fichiers et l'initialise. Tout ce que vous avez à faire, est de nommer la classe comme le fichier.

index.php

<?php
require_once __DIR__ . '/app/autoload.php';

$loader = new Loader(false);

User::dump(['hello' => 'test']);

autoload.php

<?php
class Loader 
{

    public static $library;

    protected static $classPath = __DIR__ . "/classes/";

    protected static $interfacePath = __DIR__ . "/classes/interfaces/";

    public function __construct($requireInterface = true) 
    {
        if(!isset(static::$library)) {
            // Get all files inside the class folder
            foreach(array_map('basename', glob(static::$classPath . "*.php", GLOB_BRACE)) as $classExt) {
                // Make sure the class is not already declared
                if(!in_array($classExt, get_declared_classes())) {
                    // Get rid of php extension easily without pathinfo
                    $classNoExt = substr($classExt, 0, -4); 
                    $file = static::$path . $classExt;

                    if($requireInterface) {
                        // Get interface file
                        $interface = static::$interfacePath . $classExt;
                        // Check if interface file exists
                        if(!file_exists($interface)) {
                            // Throw exception
                            die("Unable to load interface file: " . $interface);
                        }

                        // Require interface
                        require_once $interface;
                        //Check if interface is set
                        if(!interface_exists("Interface" . $classNoExt)) {
                            // Throw exception
                            die("Unable to find interface: " . $interface);
                        }
                    }

                    // Require class
                    require_once $file;
                    // Check if class file exists
                    if(class_exists($classNoExt)) {
                        // Set class        // class.container.php
                        static::$library[$classNoExt] = new $classNoExt();
                    } else {
                        // Throw error
                        die("Unable to load class: " . $classNoExt);
                    }

                }
            }
        }
    }

    /*public function get($class) 
    {
        return (in_array($class, get_declared_classes()) ? static::$library[$class] : die("Class <b>{$class}</b> doesn't exist."));
    }*/
}

vous pouvez facilement gérer avec un peu de codage, pour exiger des classes dans différents dossiers aussi.

espérons que cela puisse vous être utile.

2
répondu anttwuan 2017-02-17 08:14:23