Отличается ли объем функций (не переменных) во включаемых файлах в Javascript и PHP? - PullRequest
0 голосов
/ 13 сентября 2018

Я задал вопрос в прошлом месяце о проблеме в PHP, вызывающей функцию в одном включаемом файле, который определен в последующем включаемом файле. Эта проблема возникла при преобразовании ASP-сайта в PHP. Теперь я вижу, что проблема повторяется. Похоже, что Javascript и PHP обрабатывают определения функций во включаемых файлах совершенно по-разному.

(Изменить: я говорю здесь полностью о серверных сценариях, ничего о стороне клиента.)

  • В моих ASP-файлах (написанных на Javascript) я смог вызвать функцию в файле #include d, когда функция была определена в файле #include d после этого.
  • В PHP это не работает. Похоже, что функция должна быть определена в том же файле или в файле include() d до той, в которой она вызывается.

Это наводит на мысль о существенном различии в работе Javascript и PHP, которое я нигде не нашел документированным. Похоже, что Javascript компилирует все включенные файлы перед продолжением выполнения, тогда как PHP компилирует и выполняет каждый включаемый файл, прежде чем перейти к следующему включаемому файлу.

Страница справочника PHP по пользовательским функциям гласит: «Функции не должны быть определены до обращения к ним, за исключением случаев, когда функция определена условно». Похоже, что он также должен сказать, «и за исключением случаев, когда функция определена и вызывается в разных файлах включения». Страница руководства для include () также не решает эту проблему.

В Javascript мне приходилось думать стратегически об определении важных переменных в самых ранних включаемых файлах, чтобы они были доступны для использования при необходимости, но функции могли быть определены в любом включаемом файле и использоваться при необходимости. Но в PHP кажется, что мне нужно применять стратегическое мышление там, где я также определяю свои функции.

Кажется, что если я прав насчет того, что я здесь написал, это действительно существенное различие между Javascript и PHP, о котором следовало бы написать раньше. Так я ошибаюсь и что-то не так понял?

1 Ответ

0 голосов
/ 13 сентября 2018

Да, PHP и Javascript там сильно отличаются.

В PHP функции - это особая вещь. Функции являются глобальными; если функция была объявлена ​​один раз где-то , ее можно вызвать из где-нибудь . Объявление функции происходит, когда оператор function foo() ... выполняется во время выполнения * (вот почему условно объявленные функции являются чем-то особенным). Функции имеют одно глобальное уникальное имя; Вы не можете переопределить функцию с тем же именем. Функции не могут рассматриваться как обычные значения или переменные, например, их нельзя передать.

* Запутанная часть в том, что объявление function ... также может быть проанализировано и оценено во время анализа , шаг, непосредственно предшествующий среде выполнения. На этапе синтаксического анализа объявления условных функций оцениваются, что приводит к тому, что функции становятся доступными во время выполнения «до их объявления». Это, конечно, не работает ни для чего, что нужно оценивать во время выполнения, например для include операторов.


В функциях Javascript - это просто значения, присвоенные переменным. Функции имеют те же правила области видимости, что и переменные. Функции ведут себя так же, как обычные значения, например их можно передавать как любое другое значение. Функции - это просто вызываемые значения.

...