if结构中的函数

时间:2011-05-06 14:25:53

标签: php function if-statement

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

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

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

5 个答案:

答案 0 :(得分:16)

这是完全合法的 - 它只是定义了if语句块中的函数。那就是说,为什么你想要做到这一点有点神秘。

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

  

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

有关详细信息,请参阅PHP User-defined functions manual page

答案 1 :(得分:8)

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

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

答案 2 :(得分:5)

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

从PHP 5.3开始,如果您需要范围有限的功能(比如回调),您可以使用anonymous functions / closures

答案 3 :(得分:1)

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

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

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

Java 8

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

if

将产生foo(); function foo(){ echo 'foo!'; } 错误,至少从版本5.3开始。

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

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

因此在条件中定义函数时需要注意一个重要的问题:函数必须在调用函数之前在代码中定义,因为条件函数似乎没有在编译时定义。

OP还询问了性能问题。如果在运行时定义条件函数而不是像大多数其他函数一样定义编译时间,则此函数不会受益于OpCode缓存等性能提升器,这取决于具体情况,可能会降低应用程序的速度。例如,如果您的主php文件看起来像:

call to undefined function

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

答案 4 :(得分:0)

基本上是的,根据the manual

  

任何有效的PHP代码都可能出现在   功能,甚至其他功能和   类定义。

就我个人而言,我实际上没有做过这样的事情。大多数情况下,将函数分组到可以找到它的地方会更容易! ; - )