【问题标题】:How to Create a Global Variable in CodeIgniter?如何在 CodeIgniter 中创建全局变量?
【发布时间】:2020-03-27 14:02:11
【问题描述】:

场景: 我有一个 JSON 文件,它在一个对象中包含大约 4,000 个键值对。在 CodeIgniter 辅助函数中,我获取此文件的内容,使用 json_decode() 将内容转换为 PHP 对象并返回该对象。

代码片段

function get_characters()
{
    $json_url = base_url('keywords.json'); // path to JSON file
    $json_data = file_get_contents($json_url); // put the contents of the file into a variable
    return json_decode($json_data); // decode and return the JSON content
}

问题 1:由于每次调用该函数时都会读取 JSON 文件,因此一遍又一遍地调用此函数会影响性能吗?

问题 2: 如果它影响性能,我如何将这个函数的输出一次性存储在一个全局变量中,以便在我的应用程序中使用它?还是有更好的解决方案?

提前致谢!

【问题讨论】:

  • 代码 sn-p 会有帮助
  • @Vishal,我已经添加了代码 sn-p。

标签: php json codeigniter


【解决方案1】:

您应该在问题中包含您的代码 sn-p。不用担心,我有一个答案给你。我希望它可以帮助你完成这项工作。

答案 1:显然。

答案 2:当然有很多方法可以做到这一点。您应该将输出分配给 CI 超全局变量,如下所示:

//Your helper function may look like..
if (!function_exists('load_my_json_file'))
{
    function load_my_json_file()
    {
        $my_json = file_get_contents('./my_json.json');
        $my_json_obj = json_decode($my_json);

        //Grab the CodeIgniter native resource
        $CI = & get_instance();
        $CI->my_json_obj = $my_json_obj;
        return true;
    }

}

现在您将能够通过从控制器、模型或视图中调用 $this->my_json_obj 来访问您的 json 对象。

下面给出一个如何调用辅助函数的例子:

//app/core/MY_Controller.php
class MY_Controller extends CI_Controller
{

    public function __construct()
    {
        parent::__construct();
        //Load your helper
        $this->load->helper('common');
        //Call the json loader function
        load_my_json_file();
    }

}
//controllers/Welcome.php
class Welcome extends MY_Controller
{

    public function index()
    {
        var_dump($this->my_json_obj);
        exit();
        $this->load->view('welcome_message');
    }
}

【讨论】:

  • 我在问题中添加了代码 sn-p。它与您在答案中编写的代码非常相似。是的,在实现您的答案后,我可以在助手和控制器中全局访问变量。你能解释一下这条线发生了什么吗? $CI->my_json_obj = $my_json_obj;
  • 主要的魔力发生在$CI = & get_instance(); 声明上。当我们分配它时,$CI 指的是主 CI 控制器实例。之后,我们只需将 json 对象保存到 Codeigniter 控制器实例的属性中 $CI->my_json_obj = $my_json_obj; get_instance() 用于创建“辅助类”。 Codeigniter 有一个很好的文档:codeigniter.com/user_guide/general/ancillary_classes.html。如果它解决了您的问题,请接受答案。
【解决方案2】:
  1. 可能
  2. 你真的不能。 PHP 不会在请求之间持久化数据(即使会话数据存储在文件中)

可能更好的解决方案是使用 RDBMS 而不是 JSON 文件。

【讨论】:

    猜你喜欢
    • 2014-11-29
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多