如何在没有全局变量的情况下访问变量外部函数

时间:2012-03-18 18:43:24

标签: php variables global

我有一个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 个答案:

答案 0 :(得分:2)

使用参数将数据传递到函数中......例如:

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']);

只需选择最适合您需求的产品。

答案 1 :(得分:2)

除了将数据传递给已经提到的函数之外,您还可以为配置或全局数据创建一个类,并使用静态访问方法来检索它们。

<?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');