условный определяемые ф-ции
в php анализ кода происходит как-то так:
исходный код анализируется (проверяется синтаксис и.т.д.) и транслируется: т.е. сначала работает транслятор, он транслирует код в какой-то свой байт код. Далее PHP интерпретирует полученный байт-код, т.е выполняет его "инструкцию" одну за другой. => в PHP есть комбинация из транслятора и интерпретатора Т.е.,транслятор, дойдя до определения ф-ции, проверит корректность определения. и оттранслирует его во внутреннее представление + Каждая ф-ция добавляется во внутреннюю таблицу функций PHP тогда, когда управление доходит до участка кода, содержащего определение этой функции. Потом интерпретатор при вызове ф-ции начнет выполнение ее команд. => мы можем вызывать ф-ций до того, как они определены. если есть условное определение: $a = 10; if ($a) { function alert1() {echo "1";} } else { function alert2() {echo "2";} } alert2(); получим ошибку Fatal error: Call to undefined function alert2() in C:\xampp\htdocs\phptraining\index.php on line 59 Вроде по логике мы просто во время работы транслятора мы не "дошли" до определения функции alert2, => она не была добавлена во внутреннюю таблицу PHP функций Но ведь по идее транслятор обрабатывает весь код? И до function alert2 он тоже должен дойти. |
Обрабатывает-то весь, а функции создаёт, когда до них выполнение доходит, так же как и любые другие операторы выполняет, когда до них выполнение доходит.
|
Правильно ли я понимаю?
Очень грубо говоря: 1. Транслятор проверит все на синтаксис, 2. выполнение дойдет только до одного определения ф-ции, она же и будет транслятором добавлена во внутреннюю таблицу ф-ций PHP, (это и позволяет интерпретатору вызвать функции до их определения.). 3.затем выполнится полученный байт-код |
|
Короче, вот так делать и все:
"В случае, когда функция определяется в зависимости от какого-либо условия, например, как это показано в двух приведенных ниже примерах, обработка описания функции должна предшествовать ее вызову. " А вот интересно <script> var a = 10; if (a) { function alert1 () {alert(1);} } else { function alert2() {alert(2);} } alert2(); </script> в IE7 работает, а в Firefox ругается ) (на alert2 естесстно) |
А причём здесь JavaScript?
|
А я заодно посмотрел просто)
Здесь он не причем |
Часовой пояс GMT +3, время: 10:49. |