У меня есть система управления контентом, где константы на основе слагов для соответствующих каталогов каждого вошедшего в систему пользователя определены для одного или всех контроллеров в модели. Я случайно наткнулся на эту находку, экспериментируя с переопределением констант для каждого вошедшего в систему пользователя.
Я не думал, что переопределение констант было возможно, но я не понимаю, как Codeigniter или PHP могут переопределять константы таким способом. Я не получаю никакой ошибки PHP, утверждающей, что не удалось переопределить константы, поэтому я должен верить, что экземпляр модели или контроллера не установлен для каждого контроллера?
контроллер:
class Content extends CI_Controller {
function __construct()
{
parent::__construct();
$this->load->model('main_model');
...
get slug from logged_in user
...
$this->main->set_slug_based_constants($slug)
}
}
Одна основная модель (я знаю, что это плохо):
class Main_model extends CI_Model{
public function set_slug_based_constants($slug)
{
define('CLOUDFRONT_DIRECTORY', $slug.'_cloudfront_directory');
}
}
Из Codeigniter Docs:
Динамическое внедрение. В CodeIgniter компоненты загружаются, а подпрограммы выполняются только по запросу, а не глобально.
Поэтому я хотел бы верить в то, что мое предположение в этом случае верно, основываясь на документах Codeigniter.
Это не столько «неустановлено», сколько «еще не определено». Каждый запрос браузера к URL (контроллеру) является уникальным процессом на сервере. Таким образом, константа не переопределяется, а создается заново для каждого запроса URL.
Если вы попытаетесь запустить $this->main_model->set_slug_based_constants($slug);
во второй раз ты будут получить сообщение об ошибке PHP о том, что константа CLOUDFRONT_DIRECTORY уже определена.
Попробуйте эту версию контроллера, чтобы увидеть ошибку.
class Content extends CI_Controller
{
function __construct()
{
parent::__construct();
$this->load->model('main_model');
$this->main_model->set_slug_based_constants("Dave");
}
function index()
{
echo "The constant's value is <strong>".CLOUDFRONT_DIRECTORY."</strong><br>";
$this->main_model->set_slug_based_constants("jruser");
echo "The constant's value is <strong>".CLOUDFRONT_DIRECTORY."</strong><br>";;
}
}
Это будет производить что-то вроде этого.
Значение константы Dave_cloudfront_directory
Обнаружена ошибка PHP
Серьезность: Уведомление
Сообщение: константа CLOUDFRONT_DIRECTORY уже определена
Имя файла: models / Main_model.php
Номер строки: 13
Значение константы Dave_cloudfront_directory
Других решений пока нет …