получить доступ к глобальной переменной как статической переменной класса - PullRequest
3 голосов
/ 11 ноября 2009

Допустим, у меня есть следующий класс:

class SQLMapper{
    static find_user_by_id($id){
        //sql logic here, using the $_DATABASE global to make a connection
    }
}

Я мог бы просто позвонить:

global $_DATABASE;

вверху моей функции, но я не хочу делать это для ВСЕХ моих статических методов. Есть ли способ получить статическую переменную внутри моего класса для ссылки на глобальный массив $ _DATABASE?

РЕДАКТИРОВАТЬ: я не могу назначить его в конструкторе, так как все это статическое, и конструктор никогда не вызывается.

Ответы [ 3 ]

2 голосов
/ 11 ноября 2009

Вы можете использовать суперглобальный массив $_GLOBALS для доступа к вашей переменной $_DATABASE. Например:

query( $GLOBALS['_DATABASE'], 'some query' );

В качестве альтернативы, напишите статическую функцию, которая возвращает содержимое этой переменной:

class SQLMapper
{
    static function getDatabase()
    {
        global $_DATABASE;
        return $_DATABASE;
    }

    static function find_user_by_id($id)
    {
        query( self::getDatabase(), 'some query' );
    }
}
2 голосов
/ 11 ноября 2009

Если больно, скорее всего, вы делать это неправильно.

Прежде всего, не видя больше вашего кода, невозможно предоставить более конкретное решение, но я настоятельно рекомендую вам рассмотреть возможность перестройки структуры вашего класса так, чтобы ваши статические функции (похоже, у вас есть длинный список их реализовать) становятся нестатичными.

По сути, вам следует рассмотреть доступ к экземпляру экземпляра SQLMapper, а затем вызвать соответствующий метод из экземпляра. Используя эту парадигму, вы можете просто создать свойство уровня класса для $ _DATABASE, на которое затем могут свободно ссылаться все методы в классе.

Например:

class SQLMapper {

    private $_db;

    public function __construct()
    {
        global $_DATABASE;

        $this->_db = $_DATABASE;
    }

    public function find_user_by_id($id) {

        $sql = "Select * from User WHERE Id = ?";

        $stmt = $this->_db->prepare($sql, $id);

        return $stmt->execute();
    }
}

С учетом вышесказанного, использование глобалов - это, как правило, признак низкого качества кода, поэтому я также рекомендую вам рассмотреть возможность использования более объектно-ориентированного подхода к вашему текущему дизайну и искать проверенные и настоящие методы для удаления глобалов из вашего приложения в целом .

0 голосов
/ 11 ноября 2009

Я не уверен, что понимаю, что вы имеете в виду, извините, но вы можете попробовать использовать статическое ключевое слово 1002 *?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...