PHP类中的变量作用域


Variable scope in PHP class

我的问题很简单,但是我解决不了。

在我的index.php中,我包含了两个PHP文件

    require_once("/lib/config.php");
    require_once("/lib/connect.php");

在配置文件中声明变量#config

$config = array(  
    "db" => array(  
        "www_db" => array(  
            "username" => "user1",  
            "password" => "pass1",  
            "conn_string" => "blabla"
        )  
    ),  
    "paths" => array("images" => $_SERVER["DOCUMENT_ROOT"] . "/images")  
);  

在connect.php中我有一个单例类Connection.

    class Connection
    {
private static $instance = NULL;
public static function getInstance()
{
    if (!self::$instance)
        self::$instance = new Connection();
    return self::$instance;
}

private $conn;
// Create connection to Oracle
public function getConnection() 
{
    //if (INCLUDE_CHECK == true)
//  {
        $conn = oci_connect($this -> $config["db"]["www_db"]["username"], 
                            $this -> $config["db"]["www_db"]["password"], 
                            $this -> $config["db"]["www_db"]["conn_string"]);

我的问题是,我的连接类没有看到$config变量在config.php声明。我还尝试将$config声明为全局。我得到错误"未定义的变量:配置…"…connect.php"。请帮助。

不能在类内部看到变量,因为它是在外部声明的。把它传给同学们,使用依赖注入 (setter或构造函数注入),然后$config将在您的连接类中可用。

您必须使用global关键字来指定何时要包含全局变量。例如,它是这样工作的:

$config = array ('one' => 'two');
class Foo {
    public function bar() {
        print_r($config); // NULL
        global $config;
        print_r($config); // Array ( 'one' => 'ywo' )
    }
}

我建议在Connection.class中添加一个新的setter方法,如:

public function set_config($config = array()) {
    if (empty($config)) return false;
    $this->_username = $config["username"];
    $this->_password = $config["password"];
    // ... 
}

然后您可以在其他方法中使用这些数据,例如:

oci_connection($this->_username, $this->_password);

global $config;

我是这样解决的:

private $username = "usr1";
private $password = "pass1";
private $conn_string = "connection_string";
private $conn;
// Create connection to Oracle
public function getConnection() 
{
    $conn = oci_connect($this -> username, 
                        $this -> password, 
                        $this -> conn_string);
    if (!$conn) {
       $m = oci_error();
       echo $m['message'], "'n";
       exit;
    }
    else
    {
        return $conn;
    }
}