Во-первых, не стоит писать код в столбик, как это делаете вы. Лучше примерно так: (ваш код) function one(){ global $one; $one = "a"; function two(){ global $one; if(file_exists("./upload/$one.zip")){ $one = "_" . $one; two(); } } two(); } one(); echo $one; Так просто понятнее. Вызов внутренней ф-ии two из one напоминает какое-то замыкание, хотя его в пхп нет просто(и не надо собсно). Строка: if(file_exists("./upload/$one.zip")){, в данном случае, ищет файл с название "$one.zip",но мы то знаем, что $one это переменная. Если переменная в кавычках, то ее интерпретируют как строку, надо использовать конкатенацию : "./upload/".$one.".zip" . global используется не правильно почитать про область видимости . Достаточно так и мы уже будем видеть переменную в локальной области: $one = 'a'; function two() { global $one; } т.е ф-я обертка, в качестве one() не нужна. Если изменить ваш код по моему вкусу: <?php $one = 'file_name'; function uglyName(){ global $one; if(file_exists("./upload/".$one.".zip")){ $one = '_'.$one; uglyName(); }else{ echo $one; //блок кода если совпадений в имени не найдено. } } uglyName(); ?> Но я вобщем-то не уверен, что он работает . Вы меня сегодня меня прям раскормили плюсами, так что ставить не надо.(ну так, на всякий случай, а то...)