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

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

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

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

Ответ 1

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

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

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

Для получения дополнительной информации см. PHP Страница с описанием пользовательских функций.

Ответ 2

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

if (!function_exists("foo"))
{
    function foo()
    {
        return "bar";
    }
}

Ответ 3

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

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

Ответ 4

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

Основываясь на моем тестировании в 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.

Ответ 5

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

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

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