Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Загадка про PHP. Номер 12.

Дано:

function Test1()
{
  function Test2()
  {
  }
}

var_dump(function_exists('Test2'));
Test1();
var_dump(function_exists('Test2'));

Что выведет функция var_dump в каждом случае?

10 комментариев
Улитка 2003

Выведет false, потом true.

Евгений Степанищев (bolknote.ru) 2003

Комментарий для Улитка:

точно. знаешь или проверил?

Улитка 2003

Я еще ни одного примера отсюда не проверил в PHP! Все — только в голове, плюс справка.
Единственное что было, так это я выполнил list( $a[], $a[], $a[] ) = explode( « „, „this is array“ ); — но уже после того, как прочел ответ, мне интересно стало.

Конкретно этот вопрос — то, что функция в функции не существует, пока не будет вызвана „родительская“ функция, я знаю. И то, что она глобальной потом будет.
Один раз на практике использовал.

Евгений Степанищев (bolknote.ru) 2003

Комментарий для Улитка:

Вообще жаль, что они не изолируются.

derini 2003

помню где-то в документации это тоже описывалось

Евгений Степанищев (bolknote.ru) 2003

Комментарий для derini:

Наверняка где-то есть. Но многим ли очевидно?

Caesar 2003

Ибануца. Замечательный язык.

Болк, а зачем по твоему это нужно?
В смысле что функция глобальной оказывается.

Евгений Степанищев (bolknote.ru) 2003

Комментарий для Caesar:

Просто изоляции нет. А вот применить можно — вызовом одной или другой функции декларировать один или другой блок функций :))

Например, я подменяю в регистре 1.4 GD на два набора ф-й, в зависимости от настроек, можно, например, там это использовать.

eddie 2003

этоже относится и к классам:
function x()
{
 class y
 {
   …
 }
}
$y=new y; // undeclared
x();
$y=new y;

а мне бывает полезна такая конcтрукция:
if(!function_exists(’xxx’))
{
 function xxx(){…}
}

Евгений Степанищев (bolknote.ru) 2003

Комментарий для eddie:

Следовало ожидать — внутри функции вообще ничего не изолируется, кроме переменных.