I just want to use a $variable
at several places: not only views and controllers, but also in the routes.php
and other configuration files.
There is a file in /application/config
called constants.php
I normally put all mine in there with a comment to easily see where they are:
/**
* Custom defines
*/
define('blah', 'hello mum!');
$myglobalvar = 'hey there';
After your index.php
is loaded, it loads the /core/CodeIgniter.php
file, which then in turn loads the common functions file /core/Common.php
and then /application/constants.php
so in the chain of things it's the forth file to be loaded.
inside file application/conf/contants.php :
global $myVAR;
$myVAR= 'http://'.$_SERVER["HTTP_HOST"].'/';
and put in some header file or inside of any function:
global $myVAR;
$myVAR= 'some value';
Similar to Spartak answer above but perhaps simpler.
A class in a helper file with a static property and two instance methods that read and write to that static property. No matter how many instances you create, they all write to the single static property.
In one of your custom helper files create a class. Also create a function that returns an instance of that class. The class has a static variable defined and two instance methods, one to read data, one to write data. I did this because I wanted to be able to collect log data from controllers, models, libraries, library models and collect all logging data to send down to browser at one time. I did not want to write to a log file nor save stuff in session. I just wanted to collect an array of what happened on the server during my ajax call and return that array to the browser for processing.
In helper file:
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();
}
}
In any controller, where you might want to output all log entries made by the controller or by a library method called by the controller or by a model function called by the controller:
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());
}
Prints out:
Logging from controllerName: testLogging
Logging from modelName: testLogging
Logging from customLibrary: testLogging
The best place to declare global variable
in codeigniter
is the constants.php
file in the directory /application/config
You can define your global variable as follows
/**
* Custom definitions
*/
define('first_custom_variable', 'thisisit');
$yourglobalvariable = 'thisisimyglobalvariable';
I use a "Globals" class in a helper file with static methods to manage all the global variables for my app. Here is what I have:
<?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['helper'] = array('globals');
Lastly, for usage from anywhere within the code you can do this to set the variables:
Globals::setAuthenticatedMemeberId('somememberid');
And this to read it:
Globals::authenticatedMemeberId()
Note: Reason why I left the initialize calls in the Globals class is to have future expandability with initializers for the class if needed. You could also make the properties public if you don't need any kind of control over what gets set and read via the setters/getters.
You could also create a constants_helper.php file then put your variables in there. Example:
define('MY_CUSTOM_DIR', base_url().'custom_dir_folder/');
Then on your application/config/autoload.php, autoload your contstants helper
$autoload['helper'] = array('contstants');