if结构中的函数

Cat*_*one 17 php if-statement function

我可以在PHP结构中放入PHP中的函数吗?像这样:

<?php
    if(true){
         function HelloWorld(){
             echo "Hello World!!!";
         }
         HelloWorld();
    }
?>
Run Code Online (Sandbox Code Playgroud)

因为我已经尝试过并且有效,但我不知道它是否正确.谢谢

Joh*_*ker 16

这是完全合法的 - 它只是在if语句块中定义函数.这就是说,相当为什么你会想这样做是有点神秘.

值得注意的是,此函数将在全局范围内可用(即:在if语句块之外),如...

PHP中的所有函数和类都具有全局范围 - 即使它们是在内部定义的,也可以在函数外部调用它们,反之亦然.

有关更多信息,请参阅PHP 用户定义的函数手册页.

  • -1 它确实 *NOT* 将函数定义到 `if` 语句的范围内(实际上,`if` 语句甚至没有它自己的范围)。它将定义一个全局函数,就像任何其他 PHP 函数声明语句一样。 (2认同)

Jim*_*zuk 8

正如middaparka所说,这是完全合法的,但就使用它而言,您可能希望在声明之前检查函数是否存在:

if (!function_exists("foo"))
{
    function foo()
    {
        return "bar";
    }
}
Run Code Online (Sandbox Code Playgroud)


Nic*_*ick 6

我想在这里添加一个答案,因为其他答案中没有解决一个警告。

根据我在 5.3 中的测试,if结构内部定义的函数似乎是在运行时定义的,而不是像其他函数一样在编译时定义。

例如,在条件块之外,这样:

foo();
function foo(){
   echo 'foo!';
}
Run Code Online (Sandbox Code Playgroud)

工作正常,因为该函数是在编译时定义并在运行时执行的。但在条件块内定义函数之前调用该函数:

if(1){
   foo(); // Call to undefined function!
   function foo(){
      echo 'foo!';
   }
}
Run Code Online (Sandbox Code Playgroud)

call to undefined function至少从 5.3 版本开始会产生错误。

但是在调用函数之前在 if 块中定义该函数是有效的:

if(1){       
   function foo(){
      echo 'foo!';
   }
   foo(); // No errors, since function is defined!
}
Run Code Online (Sandbox Code Playgroud)

因此,在条件内部定义函数时需要注意一个主要问题:必须在调用函数之前在代码中定义该函数,因为条件函数似乎不会在编译时定义。

OP 还询问了性能。如果条件函数是在运行时定义的,而不是像大多数其他函数一样在编译时定义的,那么该函数将无法受益于 OpCode 缓存等性能增强器,根据情况,这可能会减慢应用程序的速度。例如,如果您的主 php 文件如下所示:

if($IsLoggedIn){
   // include files/functions and bootstrap here...
}
Run Code Online (Sandbox Code Playgroud)

那么整个应用程序可能根本无法从 OpCode 缓存中受益。


Nei*_*ken 5

看起来有点奇怪,但是这是合法的

从PHP 5.3开始,如果您需要具有有限范围的函数(比如回调),您可以使用匿名函数/闭包