Функция внутри структуры if

могу ли я поместить функцию в PHP внутри структуры if? как это:

<?php if(true){ function HelloWorld(){ echo "Hello World!!!"; } HelloWorld(); } ?> 

потому что я пробовал и работает, но я не знаю, правильно это или нет. благодаря

Это совершенно легально – он просто определяет функцию внутри блока if. Тем не менее, именно поэтому вы хотели бы сделать это, это нечто загадочное.

Также стоит отметить, что эта функция будет доступна в глобальной области (то есть: вне блока if), так как …

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

Дополнительную информацию см. В разделе « Руководство пользователя по функциям PHP».

Как говорит миддапарка , это совершенно легально, но с точки зрения его использования вы можете проверить, существует ли функция до объявления ее:

 if (!function_exists("foo")) { function foo() { return "bar"; } } 
  • документация function_exists

Это выглядит немного странно, но да, это законно

Начиная с PHP 5.3, если вам нужна функция с ограниченной областью (скажем, для обратного вызова), вы можете использовать анонимные функции / закрытия

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

Основываясь на моем тестировании в 5.3, кажется, что функции, которые определены внутри, if структуры определены во время выполнения, а не во время компиляции, как и другие функции.

Например, вне условного блока это:

 foo(); function foo(){ echo 'foo!'; } 

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

 if(1){ foo(); // Call to undefined function! function foo(){ echo 'foo!'; } } 

Вызвать call to undefined function ошибки, по крайней мере, начиная с версии 5.3.

Но определение функции в блоке if до ее вызова действительно:

 if(1){ function foo(){ echo 'foo!'; } foo(); // No errors, since function is defined! } 

Таким образом, при определении функций внутри условного выражения возникает основная проблема: функция должна быть определена в коде перед вызовом функции, поскольку условные функции, по-видимому, не определены во время компиляции.

ОП также задал вопрос о производительности. Если условная функция определена во время выполнения вместо времени компиляции, как и большинство других функций, тогда эта функция не будет пользоваться ускорителями производительности, такими как кэширование OpCode, которое в зависимости от обстоятельств может замедлить ваше приложение. Например, если ваш основной файл php выглядит так:

 if($IsLoggedIn){ // include files/functions and bootstrap here... } 

Тогда все приложение может вообще не использовать кэширование OpCode.

В принципе да, в соответствии с руководством :

Любой допустимый PHP-код может появляться внутри функции, даже других функций и определений классов.

Лично у меня не было ситуации, в которой я бы действительно делал такую ​​вещь. В большинстве случаев было бы проще группировать ваши функции в месте, где это действительно можно найти! 😉