【问题标题】:Accessing a global array inside class constructor在类构造函数中访问全局数组
【发布时间】:2011-09-05 07:30:06
【问题描述】:

我的目标是从另一个 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"] 返回一个空值,即使它是用 config.php 中的 "user" 字符串初始化的。

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

(注:PHP版本为5.3.0)

【问题讨论】:

  • "(注意:PHP 版本是 5.3.0)" -- 你有没有可能在某个地方也有命名空间声明?
  • @Denis:不,我没有在任何地方进行命名空间声明。
  • 您想要这样做的“某些原因”(无论它们可能是什么)是错误的。此外,您不应该在 ctor 中调用 connect(),因为它正在起作用。当您需要连接而不是在创建对象时调用 connect。它不必连接到有效状态。

标签: php arrays class global globals


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    代替

    $CONFIG = array();
    

    使用

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

    【讨论】:

      【解决方案3】:

      我认为在__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-&gt;value = $value 这样的代码在__construct() 中使用了很多。所以也许 php 设计者认为在 __construct() 中使用 global 不是一个好习惯。然而。毕竟,我在 php 手册中找不到提到它的词。

      【讨论】:

        猜你喜欢
        • 2017-05-18
        • 2014-02-23
        • 1970-01-01
        • 1970-01-01
        • 2015-05-09
        • 1970-01-01
        • 1970-01-01
        • 2014-09-07
        • 1970-01-01
        相关资源
        最近更新 更多