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

mum43rcc  于 2023-04-18  发布在  其他
关注(0)|答案(8)|浏览(165)

我只想在几个地方使用$variable:不仅在视图和控制器中,而且在routes.php和其他配置文件中。
我不想这样:使用Config类加载配置文件;使用CI的get_instance等等。
我只想声明一个给定的$variable(它可以是一个常量,但我需要它作为一个变量),并在任何地方使用它。
事实上...我想知道CI Bootstrap 中的哪个PHP文件是第一个被解析的文件之一,这样我就可以在那里引入我的全局变量...但不是核心/系统或不合适的文件,而是这个简单要求的“最佳”位置。

6rqinv9w

6rqinv9w1#

/application/config中有一个名为constants.php的文件
我通常把我的所有在那里与评论,很容易看到他们在哪里:

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

在加载index.php之后,它加载/core/CodeIgniter.php文件,然后依次加载公共函数文件/core/Common.php/application/constants.php,因此在这一系列事情中,它是要加载的第四个文件。

vlf7wbxs

vlf7wbxs2#

我在一个helper文件中使用了一个“Globals”类,并使用静态方法来管理我的应用程序的所有全局变量。

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()

注意:我之所以把initialize调用留在Globals类中,是为了在需要的时候可以用初始化器来扩展这个类。如果你不需要通过setter/getter来控制什么被设置和读取,你也可以把属性设置为公共的。

niknxzdl

niknxzdl3#

你也可以创建一个constants_helper. php文件,然后把你的变量放进去。

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

然后在application/config/autoload.php中,自动加载constants helper

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

yzuktlbb4#

inside file application/conf/contants.php:

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

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

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

cbjzeqam5#

CodeIgniter 4 -声明全局变量的最佳位置
在CodeIgniter 4中,我们有一个像app/config/Constant.php这样的文件夹,所以你可以在Constant.php文件中定义一个全局变量。
define('initClient_id','Usqll3ASew78hjhAc4NratBt');http://localhost/domainName/successlogin');
从任何控制器或库,您可以通过名称访问,如
echo initClient_id;print_r(initClient_id)
redirect_uri;print_r(initRedirect_uri)
基本上,在部署到服务器之前,我已经将开发和生产的所有URL作为变量放在Constant.php中,我只是对开发变量进行注解
codeignitor 4文件的加载是这样的
在你的index.php被加载之后,它会加载/core/CodeIgniter. php文件,然后依次加载公共函数文件/core/Common. php和/application/constants. php,所以在这条链中,它是第四个要加载的文件。

ujv3wf0j

ujv3wf0j6#

codeigniter中声明global variable的最佳位置是目录/application/config中的constants.php文件
可以按如下方式定义全局变量

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

xxls0lw87#

类似于上面斯巴达克的回答,但可能更简单。
帮助文件中的一个类,具有一个静态属性和两个对该静态属性进行读写的示例方法。无论您创建多少个示例,它们都将写入单个静态属性。
在你的一个自定义助手文件中创建一个类。同时创建一个返回该类示例的函数。该类定义了一个静态变量和两个示例方法,一个读数据,一个写数据。我这样做是因为我希望能够从控制器,模型,库,库模型,并收集所有的日志数据发送到浏览器一次。我不想写到日志文件,也不想保存的东西在会话。我只是想收集一个数组,其中包含在我调用 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());
}

打印输出:
从controllerName进行日志记录:测试日志
从modelName进行日志记录:测试日志
从customLibrary记录:测试日志

5uzkadbs

5uzkadbs8#

可能不是最好的地方,但是我需要定义的常量是在从外部源阅读它之后。为了解决这个问题,我们使用了钩子。
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文件夹中添加文件. PostConstructorHook.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());
    }
}

相关问题