22

我只想$variable在几个地方使用 a:不仅是视图和控制器,还包括在routes.php和其他配置文件中。

我不想要这样的事情:使用 Config 类加载配置文件;使用 CIget_instance等。

我只想声明一个给定的$variable(它可以是一个常量,但我需要它作为一个变量),并在任何地方都使用它。

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

4

7 回答 7

42

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

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

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

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

于 2013-06-09T19:41:06.557 回答
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 设置和读取的内容进行任何类型的控制,您也可以公开属性。

于 2015-05-24T17:42:02.177 回答
2

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

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

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

global $myVAR;
$myVAR= 'some value';
于 2015-04-10T23:21:51.043 回答
2

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

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

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

$autoload['helper'] = array('contstants');
于 2013-12-11T07:34:33.870 回答
0

最好的声明位置是目录global variable中的文件codeigniterconstants.php/application/config

您可以按如下方式定义全局变量

/**
 * Custom definitions
 */
define('first_custom_variable', 'thisisit');
$yourglobalvariable = 'thisisimyglobalvariable';
于 2014-09-10T11:36:45.370 回答
0

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

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

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

从任何控制器或库中,您可以按名称访问,例如

回显initClient_id;或 print_r(initClient_id);

回声initRedirect_uri;或 print_r(initRedirect_uri);

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

codeignitor 4文件的加载是这样的

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

于 2021-06-18T20:16:18.507 回答
0

类似于上面的斯巴达克答案,但可能更简单。

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

在您的一个自定义帮助文件中创建一个类。还要创建一个返回该类实例的函数。该类定义了一个静态变量和两个实例方法,一个是读取数据,一个是写入数据。我这样做是因为我希望能够从控制器、模型、库、库模型中收集日志数据,并收集所有日志数据以一次性发送到浏览器。我不想写入日志文件,也不想在会话中保存东西。我只是想收集在我的 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

从 customLibrary 记录:testLogging

于 2020-02-18T01:48:42.020 回答