2017-06-02 3 views
2

J'essaie de refactoriser mon code et d'utiliser le système de chargement automatique. Pour l'instant, je fais:Charger automatiquement le fichier de classe avec l'espace de noms

index.php:

namespace example_com; 
use example_com\Core\Application; 
require 'Application.php'; 
$app = new Application(); 
$app->MyCustomFunction(); 

Je voudrais éliminer ligne require; Je voudrais exiger à chaque fois que j'appelle new Application() ou new Class();

J'essaie comme ci-dessous:

index.php

namespace example_com; 
use example_com\Core\Application; 

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

//require 'Application.php';//remove this 
$app = new Application(); 
$app->MyCustomFunction(); 

application.php

namespace example_com\Core; 
class Application 
{ 
    //..contruct, properties, functions 
} 

= DEBUG outout =

spl_autoload_register(function($className) { //$className: "example_com/Core/Application" 
    $namespace = str_replace("\\", "/", __NAMESPACE__); //$namespace: "example_com" 
    $className = str_replace("\\", "/", $className); 
    $class = ROOT . (empty($namespace) ? "" : $namespace . "/") . "{$className}.php"; //$className: "example_com/Core/Application" $namespace: "example_com" $class: "example_com/example_com/Core/Application.php" 

Je prévois d'utiliser ceci dans différents fichiers dans le s projet amme

MISE À JOUR 1: Structure des dossiers

App/ 
--Controllers/ 
----XController.php 
----YController.php 
Core/ 
--Controllers/ 
----IBaseController.php 
----BaseController.php 
--Application.php 
index.php 
+0

Toutes vos classes se trouvent-elles dans le même dossier de base? Je pense que vous devriez avoir toutes vos classes dans le même dossier afin que vous puissiez faire un 'spl_autoload_register()' qui se chargerait en haut de votre page (peut-être dans un fichier de configuration inclus) et couvrirait toutes vos classes à travers votre application? Je ne pense pas que je ferais un autochargeur sur une base par classe. Cela peut ralentir votre application un peu. – Rasclatt

+0

Toutes mes classes ne sont pas dans le même dossier. J'édite un sujet qui montre ma structure de dossiers – reladawrefurhost

Répondre

0

Pour clarifier mon commentaire sur dans le même dossier, la structure de votre dossier Semble organisé, je viens pour confirmer que vous n'avez pas seulement des cours flottant partout. Je mettre en œuvre un seul chargeur automatique après session ou similaire, regardant dans deux endroits (voir exemple bas si plus de taches):

Dans votre fichier de configuration:

define('DS',DIRECTORY_SEPARATOR); 

spl_autoload_register(function($class) { 
    # Set base path 
    $default = ROOT.DS.'Core'; 
    # Set client/vendor path (provided "App" is the 
    # name of the root containing vendor libraries) 
    $app  = ROOT.DS.'App'; 
    # Create path 
    $path = str_replace('\\',DS,$class).'.php'; 
    # Check first that class exists in core 
    if(is_file($inc = str_replace(DS.DS,DS,$default.DS.$path))) 
     require_once($inc); 
    # Check if the class is in the "App" folder 
    elseif(is_file($inc = str_replace(DS.DS,DS,$app.DS.$path))) 
     require_once($inc); 
}); 

S'il y a plus d'endroits (ou "App" représente un nom de bibliothèque de classe pseudo), j'utiliser le fichier json avec des chemins vers les répertoires:

/Core/prefs/namespaces.json

["NewFolder/Classes","OtherFolder/Somewhere/Deeper/Classes","Vendor/Classes"] 

Dans votre fichier de configuration:

define('DS',DIRECTORY_SEPARATOR); 

spl_autoload_register(function($class) { 
    $default = ROOT.DS.'Core'; 
    $app  = ROOT.DS.'App'; 
    $path = str_replace('\\',DS,$class).'.php'; 

    if(is_file($inc = str_replace(DS.DS,DS,$default.DS.$path))) 
     require_once($inc); 
    elseif(is_file($inc = str_replace(DS.DS,DS,$app.DS.$path))) 
     require_once($inc); 
    # Here is where you will fetch the array of namespaces 
    else { 
     # Fetch and decode 
     $namespaces = json_decode(file_get_contents(ROOT.DS.'Core'.DS.'prefs'.DS.'namespaces.json'),true); 
     # Check to make sure there are namespaces to loop over 
     if(is_array($namespaces) && !empty($namespaces)) { 
      # Loop 
      foreach($namespaces as $base) { 
       # Check if the class file exists and include if it does 
       if(is_file($inc = str_replace(DS.DS,DS,ROOT.DS.$base.DS.$path))) 
        require_once($inc); 
      } 
     } 
    } 
}); 

Dans le cas ci-dessus, je ne serais probablement alors travailler à un ou deux dossiers qui hébergent soit toutes les bibliothèques de fournisseurs (y compris votre bibliothèque Core) ou deux qui peuvent être recherchées donc un Core et un dossier Vendor.