访问类构造函数中的全局数组

时间:2011-05-31 08:39:24

标签: php arrays class global globals

我的目标是从另一个PHP文件中定义的全局数组中检索一些数据。我的代码在database.php文件中运行,我想要使用的数组在config.php文件中。我理解在类中访问一个全局数组并不是一个好主意,但我想这样做是因为某些原因。

我的代码如下:

的config.php

$CONFIG = array();
// ...
$CONFIG["DATABASE"] = array();
$CONFIG["DATABASE"]["USERNAME"] = "user";
$CONFIG["DATABASE"]["PASSWORD"] = "pass";
$CONFIG["DATABASE"]["HOSTNAME"] = "127.0.0.1";
$CONFIG["DATABASE"]["DATABASE"] = "my_db";
// ...

database.php中

require('config.php');

class Database
{
    protected   $m_Link;
    private     $m_User;
    private     $m_Pass;
    private     $m_Host;
    private     $m_Data;
    private     $m_bConnected;

    public function __construct()
    {
        global $CONFIG;
        $this->m_User = $CONFIG["DATABASE"]["USERNAME"];
        $this->m_Pass = $CONFIG["DATABASE"]["PASSWORD"];
        $this->m_Host = $CONFIG["DATABASE"]["HOSTNAME"];
        $this->m_Data = $CONFIG["DATABASE"]["DATABASE"];
        $this->m_bConnected = false;
        $this->Connect();
    }

    // ...
};

没有给出错误(数据库连接通知失败除外)。

我无法访问数组元素。例如,$CONFIG["DATABASE"]["USERNAME"]即使在"user"中使用config.php字符串进行初始化,也会返回空值。

我应该如何修改我的代码,以便可以在类构造函数中访问此全局数组?

(注意:PHP版本是5.3.0)

3 个答案:

答案 0 :(得分:2)

您的代码看起来正确,所以我认为您应该只调试它。在创建Database类的实例之前尝试输出$ CONFIG,可以在代码中的某处重新定义/更改$ CONFIG。并且不要只检查数组中的一个值 - 使用var_dump / print_r输出整个数组。

答案 1 :(得分:1)

而不是

$CONFIG = array();

使用

$GLOBALS['CONFIG'] = array();

答案 2 :(得分:0)

我认为全局在__construct()中无法发挥作用。我不确定它是否是一个错误,或者它是按原样设计的。

代码

<?php
class Test {
    public $value;

    function __construct() {
        global $value;
        $value = "I am a test.";
    }
}

$test = new Test();
echo $test->value;

当php运行时你将看不到任何内容。

但是,如果您不使用全局,但使用$ this-&gt;值,一切正常。

<?php
class Test {
    public $value;

    function __construct() {
        $this->value = "I am a test.";
    }
}

$test = new Test();
echo $test->value;

如果你坚持要理由。我想也许__construct()是设计来初始化属性。像$this->value = $value这样的代码在__construct()中使用了很多。所以也许php设计师认为在__construct()中使用global是不好的做法。然而。毕竟我在php手册中找不到一句话。