Запутался с областью видимости переменной. Функция в функции, плюс записывается новая переменная. Написал простой код, нужно чтобы выводилось string1, string1, string2, string2. Пробовал с глобальными переменными, но это не получается. Понимаю, что скорее всего глупейшее непонимание, но курение мануала или гугла совсем не помогает. PHP: function test1 () { $a = "string1"; echo $a; echo "<br />"; } function test2 () { $a = "string2"; test1 (); } test1 (); test1 (); test2 (); test2 ();
Смотрим: test1 выводит string1: string1 string1 Далее: test2 выводит string1, поскольку она вызывает test1(), а она перезаписывает переменную $a, получается что выведется 4 раза string1 --- Добавлено --- Если надо чтоб так вывелось - можно передавать параметр в функцию: function ($a) { echo $a; } test1("string1"); test1("string1"); test1("string2"); test1("string2");
Тут нет функции в функции. Есть вызов первой функции внутри второй. Вызов, а не объявление. Новая переменная не записывается. Переменная $a из первой функции никак не связана с переменной $a во второй функции. test1 (); test1 (); test2 (); test2 (); Вы дважды вызываете первую функцию, а потом дважды вызываете ее из второй. При этом во второй создается своя переменная, которая не передается в первую. Попробуйте вот так: PHP: function test1 ($a = "string1") { echo $a; echo "<br />"; } function test2 () { test1 ("string2"); } test1 (); test1 (); test2 (); test2 (); Здесь у нас первая функция имеет необязательный входной параметр, который, по-умолчанию, равен string1. Когда мы вызываем первую функцию без параметров, именно это значение она выдаст на страницу. Внутри второй функции мы, как и ранее, вызываем первую, но передаем в нее, в качестве параметра, строку "string2". При явном указании параметра, используется именно он, а не значение по-умолчанию. По этому, в данном случае мы увидим string2 на странице. --- Добавлено --- P.S. Сейчас эра HTML5, а не XHTML, так что br можно писать просто как <br>.
Простое правило: Если переменная появилась в функции, не является параметром, и не указана внутри функции как global, то она локальная, т.е. имеющая отношение только к функции, в которой появилась
Однако... ты хотя бы проверяй то, что говоришь, прежде чем это утверждать. Держи, по твоей логике, на экран должно выдаваться "overrided" PHP: function test1 () { $c = "overrided"; } function test2 () { $c = "not_overrided"; test1 (); echo $c; } test2 (); Еще раз - переменная, объявленная внутри функции существует только внутри функции. Даже если переменная с таким же именем была объявлена ВНЕ функции, внутри все равно будет свой собственный экземпляр: PHP: $c = "global_value"; function test1 () { $c = "local_value"; echo $c,'<br>'; } echo $c,'<br>'; //Выводим переменную из внешней области видимости. test1(); //Объявляем такую же внутри функции и выводим ее. echo $c,'<br>'; //Проверяем, изменилась ли внешняя переменная? Нет. Более того, если попробовать использовать внутри функции глобальную переменную, мы получим notice: PHP: $c = "global_value"; function test1 () { echo $c; } test1(); //NOTICE: Undefined variable Для такого случая в php даже запилен особый костыль в виде служебного слова global, которое намекает, что переменную надо искать в области видимости вне локальной: PHP: $c = "global_value"; function test1 () { global $c; echo $c; } test1(); //global_value Фух. Выговорился. Не надо так, бро.
Вроде все предельно понятно, а у меня все равно не получается уже в моем скрипте. Смоделировал его! PHP: // устанавливем переменную, появляется из $_POST $var = 1; // эти переменные находятся в подключаемом файле php, подключаем include $x = "one".$var; $y = "two".$var; $z = "three".$var; // пишем функцию function test1 () { global $arr; $randarr = array_rand($arr, 1); echo $arr[$randarr]; echo "<br>"; } // пишем вторую функцию, как раз в ней задача изменить переменную $var, а также во всех последующих шагах цикла чтобы она осталась ей (изменить на 2) function test2 () { $var = 2; test1 (); } $arr = array($x, $y, $z); // основной цикл while ($i <= 10) { test1 (); $i++; if ($i == 5) { test2 (); $i++; } }
Передавайте в функцию значение, обрабатывайте в ней, и возвращайте из нее новое, присваивая его начальной переменной. Либо передавайте переменную по ссылке.
Ну чувак... Ты глобальную переменную $arr указал в функции как глобальную, а вот глобальную переменную $var в test2() не указал... А вообще, global не увлекайся. Отсилы одну-две можно оставить глобальных на большую систему (читал рекомендацию не более 10), лучше передавать через параметры
Все равно не получается, ни объвления глобальной переменной var, ни передача по ссылке. Кривые руки не рулят совсем
Ты сначала разберись, а потом уже делай, а не наоборот. И все будет получаться. --- Добавлено --- Ну и снова перечитай внимательно всю мою предыдущую простынь примеров. Там же код дан. И все объяснено. В том числе и то, что ты делать пытаешься.
На самом деле я и не хочу, чтобы кто-то за меня это сделал, хочу разобраться сам. Вы правы, все предельно ясно написано, однако уразуметь я этого совсем не могу. Предложенный во втором сообщении код ваш работает, только я не могу присваивать входной параметр, так как это переменная, и сделать function test ($var = $var1) не валидно. Более того совсем запутался в этом: PHP: function test ($var) { $var = 1; echo $var; } test (2); При изменении в теле функции порядка строк, изменение параметра происходит только если переменная объявлена после функции echo. Как так то. Просто выполнение функции происходит без разницы расположения. С областью видимости тут все вроде ясно, но применить на практике не получается. Буду дальше ломать голову. Спасибо большое.
непонятно, что ты тут ломаешь. все инструкции выполняются в порядке прочтения скрипта, т.е. сверху вниз справа налево, не считая умножения и деления. global вообще никогда не делай и всё.
Ты что, хочешь чтоб у тебя значения этих переменных менялись, когда функция меняет глобальную переменную $var? Так не получится.
Все получилось при условии, что я отказался от global. PHP: function test1 ($var) { $x = "one".$var; $y = "two".$var; $z = "three".$var; $arr = array($x, $y, $z); $randarr = array_rand($arr, 1); echo $arr[$randarr]; echo "<br>"; } function test2 () { global $var2; $var2 = 2; test1 ($var2); } $a = 1; while ($i <= 10) { test1 ($a); $i++; if ($i == 5) { test2 (); $a = $var2; $i++; } } Понял, что к global лучше не прибегать. Буду учиться это обходить. НО. В данной случае мне пришлось прибегнуть, так как никак не вывести было $var2 за пределы функции. Return возвращал NULL. Всем спасибо еще раз, удивительно, что столько терпения к идиотским вопросам
Назначение $var2 непонятно --- Добавлено --- Код (Text): function test1 ($var) { $x = "one".$var; $y = "two".$var; $z = "three".$var; $arr = array($x, $y, $z); $randarr = array_rand($arr, 1); echo $arr[$randarr]; echo "<br>"; } function test2 () { test1 (2); return 2; } $a = 1; while ($i <= 10) { test1 ($a); $i++; if ($i == 5) { $a = test2 (); $i++; } }
в конечном варианте эта переменная будет брать значения из массива, и перезаписывать $var $var2 = array_shift($some_arr);