Вызов функции до её объявления

Статус
В этой теме нельзя размещать новые ответы.

Роберт

Аналитик
Вызов функции до её объявления

В документации есть такие строки:
Внутри функции может появляться любой правильный код PHP, даже другие функции и определения классов.
В PHP 3 функции обязаны быть определены до обращения к ним. Такого требования нет в PHP 4.
На практике же получается что если функция в функции , то она не может быть вызвана до объявления:
PHP:
<?
function aaa()
         {

         bbb();
         function bbb()
                  {
                  echo 1;
                  }

         }
aaa();
?>
это даст: Fatal error: Call to undefined function bbb() in index.php on line 5
Если же перемещу вызов функции bbb() на десятую строку - то идёт без ошибок.
А вот для вызова функции aaa() действительно не имеет значения где находиться (без проблем вызывается и с первой строки).
Почему отклонение от документации?
 

Фанат

oncle terrible
Команда форума
потому что не надо заниматься идиотизмом и объявлять одну функцию внутри другой
 

Роберт

Аналитик
Хорошее объяснение... Значит ты считаешь что это идиотизм , а разработчики РНР считаю что это нужная вещь , и реализовали это. Может ты напишешь им что они занимаются идиотизмом и пускай уберут данный функционал?
 

zerkms

TDD infected
Команда форума
Роберт
если возможность есть - не обязательно нужно её использовать. у тебя есть возможность ходить по улицам голым и на руках. но ты ведь так не делаешь? или делаешь?

-~{}~ 30.03.09 12:53:

открыл тему. кто её закрыл и почему?

-~{}~ 30.03.09 13:00:

Роберт
а расскажи задачу. зачем ты делаешь именно так?
 

Роберт

Аналитик
Задачи нет , просто разобраться хочу...
А предыстория такова:
Была одна собственная библиотечка с набором функций , и как-то заинклюдил её из функци (тоесть получилось что типа как функции в функцие). И бах - скрипт начала ругаться что фунции не дефинированы. Посмотрел по документации - всё должно работать. Но не работает. Вот и решил выяснить причину.
 

zerkms

TDD infected
Команда форума
PHP:
function a()
{ function b() {}
}

function c()
{ function b() {}
}
как интерпретатор должен себя вести в этом случае, без вызова внешней функции (как предлагаешь ты)
 

флоппик

promotor fidei
Команда форума
Партнер клуба
потому что не надо заниматься идиотизмом и объявлять одну функцию внутри другой
что плохого в обьявлении функции внутри другой? это вообще то обычная инкапсуляция в процедурных языках. (не рассматриваем, что в пхп это очень криво реализованно)
 

Роберт

Аналитик
Ты что-то путаешь. Если посмотришь на мой пример - то увидишь что внешняя функция у меня вызвана. И уже внутри неё вызывается внутренняя.
 

Димон

Новичок
В javascript вложение функций используется. И возвращать можно функцию. Это называется "замыкание".
И пыхе можно так сделать, только это уже обфускация (запутывание кода). Поэтому лучше так не делать.

Вот хитрожопый код :)

function test()
{
function inner() { return "Я здесь!"; }
return create_function("", 'return "'.inner().'";');
}
$f = test();
echo $f();
 

Wicked

Новичок
function test()
{
function inner() { return "Я здесь!"; }
return create_function("", 'return "'.inner().'";');
}
test(); test();
пока-пока, теоретики!

-~{}~ 30.03.09 18:02:

это должно отсечь 80% случаев, когда возникает желание так сделать.
по моему мнению, остальные 20% - это исключительно случаи, когда нужно "дорегистрировать" какие-нибудь несуществующие функции, и то, как правило, это выглядит как if(!function_exists()) { function () {...} } на самом высоком уровне, а не часть другой функции.
 

Димон

Новичок
Wicked, читай между строк. "Хитрожопый код" всегда приводит к багам. Поэтому его не нужно использовать.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Роберт, в документации невозможно описать все
многие варианты синтаксиса надо изучить на практике
 

fixxxer

К.О.
Партнер клуба
>> Почему отклонение от документации?

Потому что ты видимо первый кто решил так извратиться :)))
 

Роберт

Аналитик
fixxxer
Эх... Ещё одно глупое объяснение... :(
Небось когда-то ты и рекурсию извращением называл?

Сегодня заходил в книжный магазин , случайно наткнулся на "PHP 6 в примерах" (Стивен Хольцнер) , свеженькая , 2009 года. Там 9 страниц посвящено разделу "Функции в функциях"
 

AmdY

Пью пиво
Команда форума
Стивен Хольцнер тоже чиатет этот форум :confused:, вот гад, быстро подсосал новые вения, уже и издаться успел.
 

dimagolov

Новичок
Роберт, надеюсь, ты ту макулатуру не купил? потому что "Current PHP 5 Stable: 5.2.9" и "PHP 6 в примерах" до официального релиза это на 99% развод лохов переименованием "PHP в примерах" (которая издается с бог знает каких лохматых времен) в "PHP 6 в примерах", а не примеры новых возможностей 6-ки.
 

Safary

Новичок
Роберт, кстати да, на развод похоже...
А зачем тебе функцией присоединять библиотеку? Почему не
PHP:
include('lib.php');
?
Просто для интереса спрашиваю, зачем так запутывать код, если это тут совершенно не обязательно?

-~{}~ 02.04.09 00:32:

AmdY, точно! А ещё мне кажется что он тут сидит под ником Роберт и рекламирует свою новую книгу :D
 

Роберт

Аналитик
Safary
"Функцией присоединять библиотеку" совсем даже и незачем...
Другое дело что есть действия которые могут выполняются крайне редко (ну скажем один раз за сессию , как к примеру Логин или Логоф) которые просто нету смысла подгружать всегда. Следовательно ты подгрузишь такую библиотеку только тогда когда она тебе нужна. Теоретически эта загрузка может произойти и в какой-нибудь функции. Ты видешь в этом что-то запутанное?

dimagolov
Согласен , что автор книги наверно просто вставил 2-3 новых функции и сразу переиздал книгу с фразой "РНР 6". Я просто к тому что некоторые тут умудряются назвать это извращением или идиотизмом , а разработчики РНР считают этот функционал нужным , и авторы книг по РНР тоже уделяют этому достаточное внимание.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху