Как получить доступ к переменной вне функции без глобальных переменных - PullRequest
1 голос
/ 18 марта 2012

У меня есть файл config.php с:

$globalConf =   array(
    'DbConfig'       => array(
        'Hostname'   => 'localhost',
        'Username'   => 'myuser',
        'Password'   => 'xxxxxxxx',
        'Database'   => 'mydb'
    )
);

и в другом файле (включая config.php) у меня есть эта функция:

function db_connect()
{
    if (!($db_link = mysqli_connect($globalConf['DbConfig']['Hostname'], $globalConf['DbConfig']['Username'], $globalConf['DbConfig']['Password'], $globalConf['DbConfig']['Database'])))
        exit();
    return $db_link;
}

Это не 'т работа.Мне нужно включить глобальную $globalConf в функцию db_connect(), но я не хочу этого делать (у меня больше конфигурационных переменных и несколько функций, которые требуют их, и я не хочу использовать глобальную $variable во всех функциях и подфункциях).

Я хочу установить $globalConf в качестве постоянной глобальной переменной (возможно, доступной, как класс?), Например:

mysqli_connect(myglobal::$globalConf['DbConfig']['Hostname'])

как это сделать?

Решено:

class MainConf {
public static $globalConf =   array(
    'DbConfig'       => array(
        'Hostname'   => 'localhost',
        'Username'   => 'myuser',
        'Password'   => 'xxxxxxxx',
        'Database'   => 'mydb'
    )
);
}

и:

function db_connect()
{
    if (!($db_link = mysqli_connect(MainConf::$globalConf['DbConfig']['Hostname'], MainConf::$globalConf['DbConfig']['Username'], MainConf::$globalConf['DbConfig']['Password'], MainConf::$globalConf['DbConfig']['Database'])))
        exit();
    return $db_link;
}

Ответы [ 2 ]

2 голосов
/ 18 марта 2012

Кроме передачи данных в функцию, о которой уже упоминалось, вы можете создать класс для вашей конфигурации или глобальных данных и использовать метод статического доступа для их получения.

<?php
class DbConfig {

    private static $data = array(
        'Hostname' => 'localhost',
        'Username' => 'username',
        // ...
    );

    public static function get($name) {
        return array_key_exists($name, self::$data) ? self::$data[$name] : '';
    }
}

Тогда в твоих функциях ты получишь доступ к этому так:

DbConfig::get('Hostname');
2 голосов
/ 18 марта 2012

Передача данных в функцию с использованием параметров ... например:

function db_connect($dbinfo) {
  if (!($db_link = mysqli_connect($dbinfo['Hostname'], $dbinfo['Username'], $dbinfo['Password'], $dbinfo['Database'])))
    exit();
  return $db_link;
  }

и назовите это как

db_connect($globalConf['DbConfig'])

Я думаю, что это самый простой способ.

Обновление

class MainConf {

  public $db; // this will get your $globalConf['DbConfig'] array

  function __construct($dbinfo) {
    $this->db = $dbinfo; // assign it to $db on class construction
    }

  function db_connect() {
    // use it where you want
    if (!($db_link = mysqli_connect($this->db['Hostname'], $this->db['Username'], $this->db['Password'], $this->db['Database'])))
      exit();
    return $db_link;
    }

}

Теперь вы можете передавать свои внешние данные в класс следующим образом:

$conf = new MainConf($globalConf['DbConfig']);
$dblink = $conf->db_function();

Таким образом, вам не нужно определять свои данные внутри класса. Просто передайте его как параметр, присвойте этот параметр переменной класса и используйте эту информацию везде, где вы хотите внутри класса.

Но я полагаю, вы используете эту информацию только для db_connect(), поэтому нет необходимости хранить ее на глобальном уровне внутри класса. Если вы вызываете этот метод вручную, вы можете добавить $dbinfo параметр в db_connect(), поэтому вам не нужен метод __construct(), и ваш класс будет выглядеть так

class MainConf {

  function db_connect($dbinfo) {
    if (!($db_link = mysqli_connect($dbinfo['Hostname'], $dbinfo['Username'], $dbinfo['Password'], $dbinfo['Database'])))
      exit();
    return $db_link;
    }

}

А теперь назовите это так

$conf = new MainConf;
$dblink = $conf->db_connect($globalConf['DbConfig']);

Просто выберите то, что наилучшим образом соответствует вашим потребностям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...