CodeIgniter - 声明全局变量的最佳位置
Posted
技术标签:
【中文标题】CodeIgniter - 声明全局变量的最佳位置【英文标题】:CodeIgniter - best place to declare global variable 【发布时间】:2013-06-05 11:45:33 【问题描述】:我只想在几个地方使用$variable
:不仅是视图和控制器,还包括routes.php
和其他配置文件。
我不想要这样的东西:使用 Config 类来加载配置文件;使用 CI 的 get_instance
等。
我只想声明一个给定的$variable
(它可以是一个常量,但我需要它作为一个变量),并且绝对可以在任何地方使用它。
事实上...我想知道 CI 引导程序中的哪个 PHP 文件是最先被解析的文件之一,所以我可以在那里引入我的全局变量...但不是核心/系统或不适当的文件,但最适合这个简单要求的位置。
【问题讨论】:
【参考方案1】:/application/config
中有一个名为constants.php
的文件
我通常把我所有的都放在那里,并附上评论,以便轻松查看它们的位置:
/**
* Custom defines
*/
define('blah', 'hello mum!');
$myglobalvar = 'hey there';
在您的index.php
加载后,它会加载/core/CodeIgniter.php
文件,然后依次加载公共函数文件/core/Common.php
和/application/constants.php
,因此在事情链中它是要加载的第四个文件。
【讨论】:
虽然如果我们在constants.php
声明一个全局变量,PHP 文件名会产生误导......这似乎是一个不错的地方。我已经在那里添加了我的$GLOBALS['variable'] = 'my stuff';
代码,它可以在routes.php
获得,正如我想要的那样,所以它肯定可以在控制器、视图等中使用。 +1(我会在接受其他答案之前等待其他答案;也许有人有更好的建议。)
CodeIgniter 非常灵活,例如,您可以完全调整 index.php
文件,如果您愿意,可以将其填满变量 :) 我只是想将我的所有内容都保存在常量文件中(至少对我来说)最适合他们的地方。
或者更好的建议是将您的自定义变量包含在另一个文件中,位于 index.php
文件的顶部。可能更符合您的喜好。
确实如此。 :) 并不是说我是全局变量的粉丝...这将是近 10 年来我第一次使用 PHP 使用 $GLOBALS
!它是快速、有效、简单地解决我的实际问题的“完美”选择。
您的新建议很好。到目前为止,我将继续使用constants.php
,因为它是最简单的解决方案,并且它位于标准文件中,位于application
文件夹内……在我看来,这似乎比修改 CI 的index.php
更“hacky” .谢谢!【参考方案2】:
我在帮助文件中使用“全局”类和静态方法来管理我的应用程序的所有全局变量。这是我所拥有的:
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 设置和读取的内容进行任何类型的控制,您也可以公开属性。
【讨论】:
不是每次都会返回空值。 您应该先验证结果获取器以确保设置了值【参考方案3】:您还可以创建一个 constants_helper.php 文件,然后将变量放入其中。示例:
define('MY_CUSTOM_DIR', base_url().'custom_dir_folder/');
然后在你的 application/config/autoload.php 上,自动加载你的常量助手
$autoload['helper'] = array('contstants');
【讨论】:
【参考方案4】:内部文件 application/conf/contants.php :
global $myVAR;
$myVAR= 'http://'.$_SERVER["HTTP_HOST"].'/';
并放入一些头文件或任何函数内部:
global $myVAR;
$myVAR= 'some value';
【讨论】:
【参考方案5】:在codeigniter
中声明global variable
的最佳位置是/application/config
目录下的constants.php
文件
你可以如下定义你的全局变量
/**
* Custom definitions
*/
define('first_custom_variable', 'thisisit');
$yourglobalvariable = 'thisisimyglobalvariable';
【讨论】:
【参考方案6】:与上面的 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
从 customLibrary 记录日志:testLogging
【讨论】:
【参考方案7】:CodeIgniter 4 - 声明全局变量的最佳位置
在 CodeIgniter 4 中,我们有一个类似 app/config/Constant.php 的文件夹,因此您可以在 Constant.php 文件中定义一个全局变量。
define('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,所以在这是第四个要加载的文件。
【讨论】:
以上是关于CodeIgniter - 声明全局变量的最佳位置的主要内容,如果未能解决你的问题,请参考以下文章