我有一个内容管理系统,为模型中的一个或所有控制器定义每个登录用户的相应目录的基于slug的常量。我碰巧通过尝试重新定义每个登录用户的常量来偶然发现这个发现。
我认为重新定义常量是不可能的,但我认为我不理解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');
}
}
From Codeigniter Docs: 动态实例化。在CodeIgniter中,组件被加载并且例程仅在请求时执行,而不是全局执行。
所以我想相信我的假设在这种情况下基于Codeigniter文档是正确的。
答案 0 :(得分:1)
它没有像“尚未定义”那样“未设置”。每个浏览器对URL(控制器)的请求都是服务器中的唯一进程。因此,常量不会重新定义,而是为每个URL请求重新实例化。
如果您尝试再次运行$this->main_model->set_slug_based_constants($slug);
,将收到PHP错误消息,指出已定义Constant 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