Почему global не работает при вложенности функций/инклудов больше 1?

tyler777

Новичок
Почему global не работает при вложенности функций/инклудов больше 1?

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

<?
function func1(){
#global $a;
$a = "test";
function func2(){
global $a;
echo "##$a##";
}
func2();
}
func1();
?>


При выполнении этот скрипт выдаст ####
Если раскоментировать первый global, то все работает.

Вопрос: Есть ли возможность заставить работать скрипт не используя global в func1?

В документации ничего вразумительного по данному вопросу не нашел. Может плохо искал конечно.
 

Gremboloid

инженера Гр...
тут:
#global $a;
$a = "test";

$a - переменная локальной области видимости в func1()

Какие причины заставляют пользоваться global?
 

tyler777

Новичок
То-есть сделать переменную первой функции доступной во вложенной второй кроме как передать ее параметром ни как нельзя?
 

Фанат

oncle terrible
Команда форума
Они у тебя еще и вложенные?
А это еще зачем?

Что эти функции на самом делают?
 

Angerslave

Новичок
Вообще к глобальному пространству имён нужно взвешенно относиться, а не кидать в него всё подряд :)
 

tyler777

Новичок
2Angerslave: мы сейчас не про register_globals, а про glodal говорим. Это разные вещи.

Вот реальный пример из жизни: есть функция f1, которая помимо всего прочего, делает include php-файла и возвращает результат (include возвращает занчение return).

В include объявлено несколько переменных и некоторая функция f2, в которой должен быть доступ к тем переменным, что объявлены в include (с виду кажется, что их можно сделать глобальными).

Интерпретатор, видя include, просто подставляет его код на место include. В итоге получаем 2 вложенных функции и проблему.

Понятно, что переменные функции - это ее пространство имен. Но как же быть в этом случае. Не передавать же все эти переменные как параметры во все функции данного include?....
 

HraKK

Мудак
Команда форума
Нет, надо почитать немного книжек о разработе веб приложений, а потом уже садиться что-то писать. А за такой говнокод что ты пишешь я бы руки отрывал.
Почему все нормальные люди свободно обходяться без GLOBAL не задумывался? Я вначале хотел с тобой подискусировать но потом осознал всю глубину твоей некомпетенции и расхотелось.

Так что мой совет - иди почитай умные книги (в поиске по форму найдешь какие) и возвращайся тогда когда с тобой можно будет хоть о чем-то разговаривать.

Всего хорошего.
 

Angerslave

Новичок
tyler777
Очень мало таких переменных, которые нужно передавать всюду. Если они нужны какому-то модулю - лучше модуль выделить в класс и перменную сделать свойством объекта/класса. Если же объект нужно использовать действительно везде, то объекты лучше хранить в чём-нить типа Registry, чтобы в случае чего можно было разруливать ошибки. Ну а чтобы понять всё зло засирания глобального пространства имён, "советую" поковырять PHP-Nuke, особенно версии 7.х.

-~{}~ 25.10.08 21:03:

HraKK
Бессмысленно отправлять человека читать умные книжки, если он не понимает зачем они нужны. Пусть лучше на личном опыте столкнётся с теми проблемами, которые приводят к поиску лучшего архитектурного решения, и уже за этими обобщёнными решениями полезет в умную книгу, чем откроет "Рефакторинг", скажет "ну и нафига это надо?", закроет и будет писать также, как писал, имхо.
 

Фанат

oncle terrible
Команда форума
tyler777
А ты не делай инклюд в функции другой функции.
 

jonjonson

Охренеть
tyler777, помедитируй над кодом:
PHP:
function f1()
{
    global $a;
    echo "A is {$a}<br />";
}

function f2()
{
    global $a;
    f1();
}

function f3()
{
    $a = 2;
    f1();
}

$a = 1;

f2(); // Что выведется тут?
f3(); // А что тут?
 
Сверху