Jarrod
Jarrod

Reputation: 332

Variable not being picked up

In my config.php file I have a variable that is set to 'localhost'.

 $CONFIG['MySQLi']['host'] = "localhost";

However, when I include this config.php in my database class, I test it by calling the variable in an echo through the __construct() method

 public function __construct() {
      echo $CONFIG['MySQLi']['host'];
 }

But then for some reason, I get this error:

 Notice: Undefined variable: CONFIG in C:\xampp\htdocs\Muse\classes\class.database.php on line 15

However I get no errors for importing the config.php file. Would someone be able to explain why this is happening? Thankyou

Upvotes: 0

Views: 151

Answers (3)

Jarrod
Jarrod

Reputation: 332

For anybody who still wants the answer to this question, another good way to do it is by DEFINING a variable.

define('VARIABLE', 'VALUE');

And then call it by doing VARIABLE. E.g.

<?php echo VARIABLE; ?>

Upvotes: 1

kero
kero

Reputation: 10638

The function doesn't know about variables that were defined outside due to variable scope.

public function __construct() {
    global $CONFIG;

}

should resolve this. However, this is usually considered bad practice.


Alternatively you can use static attributes as shown by Kohjah Breese, pass the config array to the constructor (as suggested by AlexP) or use a construct like the following.

/config/mysqli.php

<?php
return array(
   //what now is $CONFIG['MySQLi']
);

and in the function

public function __construct() {
    $config = include '/config/mysqli.php';
}

Upvotes: 4

Kohjah Breese
Kohjah Breese

Reputation: 4136

AS above, function do not have access to standard variables stored outside of them, but a better solution is to create a class you want to store global variables in. I use something like this:

class Conf 
{ 

    // Project
    static $CODE = 'F';
    static $NAME = 'For';
    static $ACCESS = 'public';
    static $CHARSET = 'utf-8';
    static $DATA = array();
    static $CACHE = false;
    static $HTMLINDENT = true;

    // Diagnostic
    static $SHOWEXECTIME = true;

    // Paths
    static $PATH_FILESYSTEM = '';
    static $PATH_CORE = '/var/www/sites/core';
    static $PATH_DOMAIN = 'localhost';
    static $PATH_URL = 'http://localhost/sites/for/';
    static $PATH_CACHE = 'cache/';
    static $PATH_CSS = 'css/';
    static $PATH_DATA = 'data/';
    static $PATH_JS = 'js/';
    static $PATH_LOG = 'logs/';
    static $PATH_XML = 'xml/';
    static $PATH_XSL = 'xsl/';

    // DB Details
    static $DB_USER = 'root';
    static $DB_PASS = 'pass';
    static $DB_DSN = 'mysql:host=localhost;dbname=for;charset=utf8';

}

My tests showed this to be the quickest solution. Some people use constants, which are very slow. Globals have been depreciated, and are a security risk.

You can access any of these vars from anywhere in PHP using Conf::$NAME; etc.

Upvotes: 0

Related Questions