1

我的目标是从另一个 PHP 文件中定义的全局数组中检索一些数据。我的代码在database.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";
// ...

数据库.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)

4

3 回答 3

2

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

于 2011-05-31T08:57:46.350 回答
1

代替

$CONFIG = array();

采用

$GLOBALS['CONFIG'] = array();
于 2011-07-29T19:58:26.473 回答
0

我认为有些全球化在__construct(). 我不确定它是一个错误还是它是按原样设计的。

对于代码

<?php
class Test {
    public $value;

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

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

当上面的 php 运行时,你什么也看不到。

但是,如果您不使用全局,而是使用 $this->value,则一切正常。

<?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 手册中找不到提到它的词。

于 2013-09-03T03:16:32.520 回答