Как сделать чтобы все переменные, используемые в PHP-сценарии, были глобальными?

Fortop

Новичок
Вызывается 1-я функция, обрабатывает переменные - из нее вызывается 2-я функция и тоже обрабатывает эти же переменные - из 2-й вызывается 3-я...и т.д. по лесенке. А потом понадобилось опять обработать эти переменные 2-й функцией, но без вызова 3-й и последующих... что тогда?
PHP:
$varFunc1 = func1($varRaw);
$varFunc2 = func2($varFunc1);
$varFunc3 = func3($varFunc2);
$varSkiped = func3($varRaw);
// а можно и так
$varFunc3 = func3(func2(func1($varRaw)));
$varSkiped = func3($varRaw);
Соответственно если на каком-то этапов что-то не нужно - его можно опустить.
Вопрос передачи по ссылке не должен тебя волновать до тех пор пока ты не поймешь насколько плохо иметь сотни переменных в глобальной области видимости.

-~{}~ 06.03.10 04:01:

А как сделать, чтобы функция вернула, например две переменных и один массив?
Можно использовать многомерные массивы

PHP:
$data = array($var, $var2, array(еще что-нибудь));
Соответственно передавать именно такой массив

Но можно использовать и объект
PHP:
function func1() {
    $obj = new StdClass();
    $obj->var1 = $var1;
    $obj->var2 = $var2;
    $obj->arr1 = array($var1, $var2);
return $obj;
}
 

sakon

П..и.н..ок
1. А не слишком много ты хочешь вытащить из одной функции? Может стоит рмзбить на несколько более простых?
2. Есле совсем туго, то используй ассоциативный массив.
 

HackHits24

Новичок
Вопрос передачи по ссылке не должен тебя волновать до тех пор пока ты не поймешь насколько плохо иметь сотни переменных в глобальной области видимости.
Fortop
Плохо иметь переменные в глобальной области видимости - это только из-за небезопасности?
 

sakon

П..и.н..ок
Fortop
Дай ему разобраться с азами...

-~{}~ 06.03.10 05:06:

HackHits24
Нет.
 

HackHits24

Новичок
да я уже разобрался)
с массивом идея хорошая - так и сделаю!

А кроме небезопасности - что еще? ...интересно чем так плохи глобальные переменные...
 

Fortop

Новичок
Меня иметь не надо.

Плохо иметь переменные в глобальной области видимости - это только из-за небезопасности?
Поясняю на пальцах. Человек способен удержать в области своего внимания от 3 до 7ми предметов одновременно. Это касается чего угодно.

Когда у тебя много функций и много переменных, ты например столкнешься с банальной проблемой именования в циклах. $i1, $i2, $iN... т.е. тебе зачем-то надо будет помнить сколько у тебя было циклов, условных конструкций и т.д.

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

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

sakon

П..и.н..ок
Fortop
Браво. Т.е. или индивидуальный скрипт или нужен интерфейс.
 

baev

‹°°¬•
Команда форума
Автор оригинала: HackHits24
А кроме небезопасности - что еще? ...интересно чем так плохи глобальные переменные...
http://php.net/manual/en/security.globals.php
Помимо прочего, в следующей версии php их просто не будет. И весь код придётся…
…правильно, придётся переписывать.

Автор оригинала: HackHits24
Удобно было бы, если бы каждая созданная переменная (как внутри функции, так и вне функции) была глобальной и могла бы использоваться в любой другой функции этого сценария.
— Вам не внутри «сценария» доступ нужен, а внутри сессии: http://phpfaq.ru/sessions
 

Ralph

Дикий столяр
[offtop]

Мне было проще :) Я начинал писать на Assembler'e,где все регистры микропроцессора ВСЕГДА глобальны для ВСЕГО кода и так намучился с этими PUSHами и POPами в начале и конце подпрограммы,что начав использовать PHP и увидев понятие области видимости переменной,был не огорчен,а наоборот,приятно удивлен.Это как зарядка по утрам (или чистка зубов) :неудобства от нее небольшие и большей мере кажущиеся,но избавляет от многих будущих гораздо более серьезных проблем и неудобств :)

[/offtop]
 

freeek

Новичок
добавь переменные в суперглобальный массив глобалс)))

$GLOBALS['myvar'] = 1;
echo $myvar;

а если честно, как сказали выше, это полная хня подобным образом писать приложения, даже минимальные скрипты
 

Alexandre

PHPПенсионер
Как сделать чтобы все переменные и массивы, используемые в PHP-сценарии были глобальными?
этого не надо хотеть, получится неразбериха и появятся потенциальные ошибки.
 

Фанат

oncle terrible
Команда форума
оооо, жесткий наброс.
и как это я эту тему пропустил :)
 

freeek

Новичок
Автор оригинала: baev
— ну и нахрена советовать «полную хню»?..
потому что если человеку лень разбираться в таком вопросе, ваши советы ему не помгут
пусть споткнется, возможно тогда быстрее поймет, что что-то необходимо менять
 

HackHits24

Новичок
Автор оригинала: freeek
добавь переменные в суперглобальный массив глобалс)))

$GLOBALS['myvar'] = 1;
echo $myvar;

а если честно, как сказали выше, это полная хня подобным образом писать приложения, даже минимальные скрипты
Я думал, что это то, что мне нужно было.. но нет... не работает. Вот что мне надо:
$GLOBALS['a'] = 3;

function f1() {
$a = 5;
}

f1();
echo $a;
Должно вывести 5, но как этого добиться?
 

С.

Продвинутый новичок
И совершенно корректно не работает. freeek сам не понимает того, что советует.
 

freeek

Новичок
да уж нет , скорее всего HackHits24 не понимает того что делает

$GLOBALS['a'] ; и function f1() {$a;}

разные переменные, но тем не менее доступ к $GLOBALS['a'] сохраняется внутри f1

это так, кстати


понятно что, так впринципе нельзя ничего писать
а ТС не полениться, а почитать http://www.php.ru/manual/language.variables.scope.html
 

HackHits24

Новичок
я понимаю что это разные переменные, но я хотел чтобы они использовали одну переменную, т.е. чтобы работало вот так:

PHP:
<?php  
$a = 1;    
function f1() {  
$a = 5;  
}   

f1();    

echo $a;  
?>
должно вывести $a = 5;
(т.е. чтобы функция могла изменять глобальные переменные)

-~{}~ 20.03.10 15:27:


freeek
а за статью спасибо! Сделал вот так:
<?php
$a[1] = 3;

function f1() {
global $a;
$a[1] = 5;
}

f1();
echo $a[1]; // выводит 5
?>

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

Но как можно споткнуться, ипользуя global? Чем это небезопасно? register_globals ведь отключен
 

С.

Продвинутый новичок
Но как можно споткнуться, ипользуя global?
получится неразбериха и появятся потенциальные ошибки.
Представь, что тебе надо дополнить функциональность программы спустя некоторое время. Ты не будешь помнить все в деталях. И стоит тебе ввести новую переменную (типа $summa), которая на самом деле уже где-то задействована ранее (о чем ты естественно не помнишь) и тебе обеспечено удовольствия от бития головой о стену в течение некоторого времени. Ты конечно найдешь потом причину, но будешь вопиить, почему не слушал маму и phpclub.
 
Сверху