在每个用户的模型中重新定义Codeigniter基于slug的常量

时间:2016-08-18 18:34:45

标签: php codeigniter constants class-constants

我有一个内容管理系统,为模型中的一个或所有控制器定义每个登录用户的相应目录的基于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文档是正确的。

1 个答案:

答案 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