CodeIgniter - 声明全局变量的最佳位置

问题描述 投票:0回答:8

我只想在几个地方使用

$variable
:不仅是视图和控制器,还有
routes.php
和其他配置文件。

我不想要这样的东西:使用Config类加载配置文件;使用 CI 的

get_instance
,等等。

我只想声明一个给定的

$variable
(它可以是一个常量,但我需要它作为一个变量),并且绝对在任何地方都使用它。

事实上......我想知道 CI 引导程序中的哪个 PHP 文件是最先被解析的文件之一,所以我可以在那里引入我的全局变量......但不是核心/系统或不适当的文件,但是满足这个简单要求的“最佳”位置。

php codeigniter global-variables global
8个回答
44
投票

/application/config
中有一个文件叫
constants.php

我通常把我所有的都放在那里并附上评论,以便轻松查看它们在哪里:

/**
 * Custom defines
 */
define('blah', 'hello mum!');
$myglobalvar = 'hey there';

加载

index.php
后,它会加载
/core/CodeIgniter.php
文件,然后依次加载通用函数文件
/core/Common.php
,然后是
/application/constants.php
所以在链中它是第四个要加载的文件。


6
投票

我在辅助文件中使用“全局”类和静态方法来管理我的应用程序的所有全局变量。这是我所拥有的:

globals_helper.php(在 helpers 目录中)

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

// Application specific global variables
class Globals
{
    private static $authenticatedMemberId = null;
    private static $initialized = false;

    private static function initialize()
    {
        if (self::$initialized)
            return;

        self::$authenticatedMemberId = null;
        self::$initialized = true;
    }

    public static function setAuthenticatedMemeberId($memberId)
    {
        self::initialize();
        self::$authenticatedMemberId = $memberId;
    }


    public static function authenticatedMemeberId()
    {
        self::initialize();
        return self::$authenticatedMemberId;
    }
}

然后在 autoload.php 文件中自动加载它

$autoload['helper'] = array('globals');

最后,对于代码中任何地方的使用,您可以这样做来设置变量:

Globals::setAuthenticatedMemeberId('somememberid');

阅读它:

Globals::authenticatedMemeberId()

注意:我将初始化调用留在 Globals 类中的原因是,如果需要,将来可以使用该类的初始化器进行扩展。如果您不需要对通过 setter/getter 设置和读取的内容进行任何类型的控制,您也可以公开这些属性。


2
投票

您还可以创建一个 constants_helper.php 文件,然后将您的变量放在那里。例子:

define('MY_CUSTOM_DIR', base_url().'custom_dir_folder/');

然后在你的 application/config/autoload.php 上,自动加载你的常量助手

$autoload['helper'] = array('contstants');

2
投票

内部文件 application/conf/contants.php :

global $myVAR;
$myVAR= 'http://'.$_SERVER["HTTP_HOST"].'/';

并放入一些头文件或任何函数内部:

global $myVAR;
$myVAR= 'some value';

1
投票

CodeIgniter 4 - 声明全局变量的最佳位置

在 CodeIgniter 4 中,我们有一个像 app/config/Constant.php 这样的文件夹,因此您可以在 Constant.php 文件中定义一个全局变量。

define('initClient_id','Usqrl3ASew78hjhAc4NratBt'); define('initRedirect_uri','http://localhost/domainName/successlogin');

从任何控制器或库,您可以通过名称访问

echo initClient_id;或 print_r(initClient_id);

echo initRedirect_uri;或 print_r(initRedirect_uri);

基本上,在部署到服务器之前,我已经将所有开发和生产的 URL 作为变量放在 Constant.php 中,我只是注释开发变量

codeignitor 4文件的加载方式是这样的

加载 index.php 后,它会加载 /core/CodeIgniter.php 文件,然后依次加载通用函数文件 /core/Common.php 和 /application/constants.php这是第四个要加载的文件。


0
投票

global variable
中声明
codeigniter
的最佳位置是目录
constants.php
中的
/application/config

文件

你可以定义你的全局变量如下

/**
 * Custom definitions
 */
define('first_custom_variable', 'thisisit');
$yourglobalvariable = 'thisisimyglobalvariable';

0
投票

类似于上面的 Spartak 答案,但可能更简单。

辅助文件中的一个类,具有静态属性和两个读取和写入该静态属性的实例方法。无论您创建多少个实例,它们都会写入单个静态属性。

在您的自定义帮助文件之一中创建一个类。还创建一个返回该类实例的函数。该类定义了一个静态变量和两个实例方法,一个读取数据,一个写入数据。我这样做是因为我希望能够从控制器、模型、库、库模型收集日志数据,并收集所有日志数据以一次性发送到浏览器。我不想写入日志文件,也不想在会话中保存内容。我只是想收集一个数组,其中包含在我的 ajax 调用期间服务器上发生的事情,并将该数组返回给浏览器进行处理。

在辅助文件中:

if (!class_exists('TTILogClass')){
    class TTILogClass{


        public static $logData = array();


        function TTILogClass(){


        }

        public function __call($method, $args){
            if (isset($this->$method)) {
                $func = $this->$method;
                return call_user_func_array($func, $args);
            }
        }

        //write to static $logData
        public function write($text=''){
            //check if $text is an array!
            if(is_array($text)){
                foreach($text as $item){
                    self::$logData[] = $item;
                }
            } else {
                self::$logData[] = $text;
            }
        }

        //read from static $logData
        public function read(){
            return self::$logData;
        }

    }// end class
} //end if

//an "entry" point for other code to get instance of the class above
if(! function_exists('TTILog')){
    function TTILog(){  
        return new TTILogClass();

    }
}

在任何控制器中,您可能希望输出控制器或控制器调用的库方法或控制器调用的模型函数生成的所有日志条目:

function testLogging(){
    $location = $this->file . __FUNCTION__;
    $message = 'Logging from ' . $location;

    //calling a helper function which returns 
    //instance of a class called "TTILogClass" in the helper file

    $TTILog = TTILog();

    //the instance method write() appends $message contents
    //to the TTILog class's static $logData array

    $TTILog->write($message);

    // Test model logging as well.The model function has the same two lines above,
    //to create an instance of the helper class TTILog
    //and write some data to its static $logData array


    $this->Tests_model->testLogging();

    //Same thing with a library method call
    $this->customLibrary->testLogging();

    //now output our log data array. Amazing! It all prints out!
    print_r($TTILog->read());
}

打印出来:

从控制器名称记录:testLogging

从模型名称记录:testLogging

从自定义库记录:testLogging


0
投票

可能不是最好的地方,但我需要定义的常量是在从外部源读取它之后。为了解决这个问题,我们使用了钩子。

https://www.codeigniter.com/userguide3/general/hooks.html

在 config.php 中启用挂钩

编辑/添加 hooks.php

$hook['post_controller_constructor'] = array(
    'class'    => 'PostContructorHook',
    'function' => 'initialize',
    'filename' => 'PostContructorHook.php',
    'filepath' => 'hooks',
);

在 hooks 文件夹中添加文件。 PostContructorHook.php

class PostContructorHook {
    function initialize(){
        if (defined('MY_CONSTANT')){
            return;
        }
        $CI = & get_instance();
        $CI->load->model('vendorModel', 'vendorModel'); //load the caller to external source
        define('MY_CONSTANT',$CI->vendorModel->getConstant());
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.