Доступ к глобальному массиву внутри конструктора класса - PullRequest
0 голосов
/ 31 мая 2011

Моя цель - извлечь некоторые данные из глобального массива, который определен в другом файле 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 ]

2 голосов
/ 31 мая 2011

Ваш код выглядит правильно, поэтому я думаю, что вы должны просто отладить его Попробуйте вывести $ CONFIG перед созданием экземпляра класса Database, $ CONFIG может быть переопределен / изменен где-то в вашем коде. И не просто проверяйте одно значение в массиве - выведите весь массив с помощью var_dump / print_r.

1 голос
/ 29 июля 2011

вместо

$CONFIG = array();

использовать

$GLOBALS['CONFIG'] = array();
0 голосов
/ 03 сентября 2013

Я думаю, что некоторые глобальные не работают в __construct(). Я не уверен, что это ошибка или она разработана так, как она есть.

Для кода

<?php
class Test {
    public $value;

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

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

Вы ничего не увидите, когда запустится выше php.

Однако, если вы не используете global, а используете значение $ this->, все работает нормально.

<?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-дизайнер считает, что не рекомендуется использовать global в __construct (). Тем не мение. Я не могу найти слово упомянул это в руководстве по PHP в конце концов.

...