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


How to access variable outside function without globals variables

我有一个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;
}

这行不通。我需要在db_connect()函数中包含全局$globalConf,但我不想这样做(我有更多的配置变量和多个需要这些变量的函数,我不想在所有函数和子函数中使用全局$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;
}

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

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

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

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(),所以没有必要在类内将其保持在全局级别。如果您手动调用该方法,您可以在db_connect()中添加$dbinfo参数,这样您就不需要__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']);

只需选择最适合您需求的即可。

相关文章: