Je vois que vous utilisez controller_*****
y model_*****
comme convention de dénomination des classes.
J'ai lu un fantastique article qui propose une convention de dénomination alternative en utilisant l'algorithme de php. namespace
.
J'aime cette solution car l'endroit où je place mes classes n'a pas d'importance. Le site __autoload
le trouvera, peu importe où il se trouve dans ma structure de fichiers. Cela me permet également d'appeler mes classes comme je le souhaite. Je n'ai pas besoin d'une convention de dénomination des classes pour que mon code fonctionne.
Vous pouvez, par exemple, configurer votre structure de dossiers comme suit :
- application/
- Contrôleurs/
- modèles/
Vos classes peuvent être configurées comme suit :
<?php
namespace application\controllers;
class Base {...}
et :
<?php
namespace application\models;
class Page {...}
L'autochargeur pourrait ressembler à ceci (ou voir 'une note sur l'autochargeur' à la fin) :
function __autoload($className) {
$file = $className . '.php';
if(file_exists($file)) {
require_once $file;
}
}
Ensuite... vous pouvez appeler les classes de trois façons :
$controller = new application\controllers\Base();
$model = new application\models\Page();
ou,
<?php
use application\controllers as Controller;
use application\models as Model;
...
$controller = new Controller\Base();
$model = new Model\Page();
ou,
<?php
use application\controllers\Base;
use application\models\Page;
...
$controller = new Base();
$model = new Page();
EDIT - une note sur l'autoloading :
Mon chargeur automatique principal ressemble à ça :
// autoload classes based on a 1:1 mapping from namespace to directory structure.
spl_autoload_register(function ($className) {
# Usually I would just concatenate directly to $file variable below
# this is just for easy viewing on Stack Overflow)
$ds = DIRECTORY_SEPARATOR;
$dir = __DIR__;
// replace namespace separator with directory separator (prolly not required)
$className = str_replace('\\', $ds, $className);
// get full name of file containing the required class
$file = "{$dir}{$ds}{$className}.php";
// get file if it is readable
if (is_readable($file)) require_once $file;
});
Cet autoloader est une correspondance directe 1:1 du nom de la classe à la structure du répertoire ; l'espace de nom est le chemin du répertoire et le nom de la classe est le nom du fichier. Ainsi, la classe application\controllers\Base()
défini ci-dessus chargerait le fichier www/application/controllers/Base.php
.
Je place l'autoloader dans un fichier, bootstrap.php, qui se trouve dans mon répertoire racine. On peut soit l'inclure directement, soit modifier le fichier php.ini comme suit auto_prepend_file afin qu'il soit inclus automatiquement dans chaque demande.
En utilisant spl_autoload_register vous pouvez enregistrer plusieurs fonctions autoload pour charger les fichiers de classe comme vous le souhaitez. Par exemple, vous pouvez placer une partie ou la totalité de vos classes dans un seul répertoire, ou vous pouvez placer une partie ou la totalité de vos classes dans un seul répertoire. classes à espacement de noms dans un seul fichier . Très flexible :)