我有一个内容管理系统,其中为每个登录用户的适当目录定义了模型中的一个或所有控制器的基于片段的常量。我碰巧偶然发现了这个发现,因为我尝试了重新定义每个登录用户的常量。
我认为重新定义常量是不可能的,但我不理解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文档:动态实例化。在CodeIgniter中,只在请求时才加载组件并执行例程,而不是全局执行。
因此,我想相信,在这种情况下,基于Codeigniter文档,我的假设是正确的。
发布于 2016-08-19 13:58:13
与其说是“未定”,不如说是“尚未界定”。对URL (控制器)的每个浏览器请求都是服务器中唯一的进程。因此,该常量不会被重新定义,而是对每个URL请求进行新的实例化。
如果您第二次尝试运行$this->main_model->set_slug_based_constants($slug);,将得到一个错误消息,说明已经定义的常量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已经定义 文件名:model/Main_model.Main 线路号码: 13 常数的值是Dave_cloudfront_directory
https://stackoverflow.com/questions/39025256
复制相似问题