Я вижу, вы используете controller_*****
и model_*****
в качестве соглашения об именах классов.
Я прочитал фантастическую статью , в которой предлагается альтернативное соглашение об именах с использованием php's namespace
.
Мне нравится это решение, потому что не имеет значения, куда я ставлю свои занятия. __autoload
найдет его независимо от того, где он находится в моей файловой структуре. Это также позволяет мне называть мои занятия, как я хочу. Мне не нужно соглашение об именах классов, чтобы мой код работал.
Например, вы можете настроить структуру папок следующим образом:
- применение /
- Контроллеры /
- модель /
Ваши классы могут быть настроены так:
<?php
namespace application\controllers;
class Base {...}
и
<?php
namespace application\models;
class Page {...}
Автозагрузчик может выглядеть следующим образом (или посмотреть «примечание по автозагрузке» в конце):
function __autoload($className) {
$file = $className . '.php';
if(file_exists($file)) {
require_once $file;
}
}
Тогда ... вы можете вызывать классы тремя способами:
$controller = new application\controllers\Base();
$model = new application\models\Page();
или
<?php
use application\controllers as Controller;
use application\models as Model;
...
$controller = new Controller\Base();
$model = new Model\Page();
или
<?php
use application\controllers\Base;
use application\models\Page;
...
$controller = new Base();
$model = new Page();
РЕДАКТИРОВАТЬ - заметка об автозагрузке:
Мой основной автозагрузчик выглядит так:
// 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;
});
Этот автозагрузчик является прямым отображением имени класса 1: 1 в структуру каталогов; пространство имен - это путь к каталогу, а имя класса - это имя файла. Таким образом, класс application\controllers\Base()
, определенный выше, загрузит файл www/application/controllers/Base.php
.
Я поместил автозагрузчик в файл bootstrap.php, который находится в моем корневом каталоге. Это может быть либо включено напрямую, либо php.ini может быть изменен на auto_prepend_file , чтобы он включался автоматически при каждом запросе.
Используя spl_autoload_register , вы можете зарегистрировать несколько функций автозагрузки для загрузки файлов классов любым удобным для вас способом. То есть, вы можете поместить некоторые или все ваши классы в один каталог, или вы можете поместить некоторые или все ваши классы пространств имен в один файл . Очень гибкий:)