Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Глобальные переменные в функции


Автор: sidd 21.12.2007, 22:41
Изначально в функции недоступны глобальные переменные. Решить эту проблему можно функцией global, но это не удобно, так как придется объявлять все необходимые мне переменные.
Можно ли как-то сделать, чтоб в функции сразу были доступны для использования все глобальные переменные?

Автор: flashaa 21.12.2007, 22:46
Цитата(sidd @  21.12.2007,  22:41 Найти цитируемый пост)
Можно ли как-то сделать, чтоб в функции сразу были доступны для использования все глобальные переменные?

$globals[''] - берите значение нужной переменной.
Вообще область видимости не зря придумана. Попытка обходить её таким образом говорит о том, что решение наверняка не совсем политкорректное.

Автор: sidd 21.12.2007, 23:34
flashaa, благодарю.

Автор: Mal Hack 21.12.2007, 23:39
Что значит не доступны? Глобальные переменные на то и глобальные, что доступны везде. Другое дело, что изменяя их вы не изменяете их глобально, для этого global нужен.

Автор: sidd 22.12.2007, 00:09
Цитата(Mal Hack @ 21.12.2007,  23:39)
Что значит не доступны? Глобальные переменные на то и глобальные, что доступны везде. Другое дело, что изменяя их вы не изменяете их глобально, для этого global нужен.

Ясно. Я неправильно выразился smile

Автор: vasac 22.12.2007, 15:46
Цитата(Mal Hack @  21.12.2007,  23:39 Найти цитируемый пост)
Глобальные переменные на то и глобальные, что доступны везде. Другое дело, что изменяя их вы не изменяете их глобально, для этого global нужен. 

А для доступа global не нужен?

Автор: SelenIT 22.12.2007, 15:56
Цитата(Mal Hack @  21.12.2007,  23:39 Найти цитируемый пост)
Глобальные переменные на то и глобальные, что доступны везде.

Мануал, http://php.net/global, иного мнения...
Цитата

Код
<?php
$a = 1; /* глобальная область видимости */ 

function Test()
{ 
    echo $a; /* ссылка на переменную локальной области видимости */ 
} 

Test();
?>

Этот скрипт не сгенерирует никакого вывода, поскольку выражение echo указывает на локальную версию переменной $a, а в пределах этой области видимости ей не не было присвоено значение. Возможно вы заметили, что это немного отличается от языка C в том, что глобальные переменные в C автоматически доступны функциям, если только они не были перезаписаны локальным определением. Это может вызвать некоторые проблемы, поскольку люди могут нечаянно изменить глобальную переменную. В PHP, если глобальная переменная будет использоваться внутри функции, она должна быть объявлена глобальной внутри нее.

flashaa, про регистр только не забывайте ;)

Автор: Mal Hack 22.12.2007, 16:21
SelenIT, нету у меня сервака проверить, может быть и проглючил.. Привык, что в Сях - так, как написал я. В ПХП я клобальные вообще не использую...

Автор: flashaa 22.12.2007, 17:40
В PHP у каждой ф-ции СВОЯ область видимости.
Поэтому переменные, объявленные выше, в самой ф-ции недоступны.
Для доступа к ним нужен global, который означает вот что:

Код

global $a;  

$a = &$GLOBALS['a'];  // Аналогично  предыдущей строке


Есть набор суперглобальныз переменных, которые видны отовсюду- $_REQUEST, $_SESSION, $GLOBALS  и тп.

Автор: madFobos 27.12.2007, 09:06
Если в функции нужно использовать слишком много глобальных переменных, то эта функция не есть правильная, из нее нужно создавать класс и т.п. Как бы сам PHP говорит, что global по сути не лучший способ и его нужно при возможности обходить.
Однако если все же нужно в функции использовать множество глобальных переменных без их объявления, то пожалуйста:
$GLOBALS['var_name']
Еще как вариант, если переменные не изменяются нигде, то можно их обявлять как константы (они тоже имеют суперглобальную область видимости, т.е. везде)

Автор: FractalizeR 27.12.2007, 20:23
Цитата(sidd @ 21.12.2007,  22:41)
Изначально в функции недоступны глобальные переменные. Решить эту проблему можно функцией global, но это не удобно, так как придется объявлять все необходимые мне переменные.
Можно ли как-то сделать, чтоб в функции сразу были доступны для использования все глобальные переменные?

Подводя итог беседы smile
Они все доступны через super-global массив $GLOBALS

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)