为什么这些PHP嵌套函数示例的行为有所不同?

时间:2017-03-18 15:31:15

标签: php function nested

看起来PHP通常需要在使用之前定义嵌套函数。但是使用require动态构建的代码没有相同的限制。任何人都可以解释为什么不一致吗?

编辑:只是为了澄清,我想要理解的是:为什么示例2工作而不是像示例1那样失败?

示例1

如果这是文件nested1.php的内容:

<?php
function outer() {
    inner();
    function inner() {
        print "Hello world.\n";
    }
}
outer();
?>

使用php nested1.php运行此命令会返回:

PHP Fatal error: Call to undefined function inner() in nested1.php on line 3

但是,如果您将inner()函数调用移到函数定义下面,如下所示:

<?php
function outer() {
    function inner() {
        print "Hello world.\n";
    }
    inner();
}
outer();
?>

再次运行你得到:

Hello world.

示例2

如果这是nested2.php的内容:

 <?php
function outer() {
    require "inner.php";
}
outer();
?>

这是inner.php

的内容
<?php
    inner();
    function inner() {
        print "Hello world.\n";
    }
?>

使用php nested2.php运行此命令会返回:

Hello world.

3 个答案:

答案 0 :(得分:3)

第一次调用outer()函数时,其中的inner()函数将在全局范围内声明。

function outer() {
    function inner() {
        print "Hello world.\n";
    }
    inner();
}
outer();
outer();//Second call

因此,您将收到以下错误:

Fatal error:  Cannot redeclare inner()

因为对outer()的第二次调用试图重新声明inner()函数。

为了避免此问题,您需要使用如下的匿名函数声明:

function outer() {

    $inner = function () {
        print "Hello world.\n";
    };

    $inner();
}
outer();
outer();

在这种情况下$inner仅在本地函数“外部”范围内可用

答案 1 :(得分:2)

示例1: PHP does not support nested functions. It only supports inner functions. Nested function reference

Inner function reference

<?php
function outer() {
    inner();
    function inner() {
        print "Hello world.\n";
    }
}
outer();

示例2: In this function you are just requiring file which includes and evaluates the scripts. Reference

<?php
function outer() {
    require "inner.php";
}
outer();
?>

<?php
    inner();
    function inner() {
        print "Hello world.\n";
    }
?>

答案 2 :(得分:0)

在你的第一个例子中,你试图在另一个函数中定义一个新函数,但php不允许嵌套函数。做这样的事情会很好:

<?php
function outer() {
    inner();
}
outer();
function inner() {
    print "Hello world.\n";
}
?>

在第二个示例中,您要包含一个文件。由于您没有在inner.php中使用嵌套函数,因此代码按预期工作。