在PHP中调用一个函数内的另一个函数

7
1    function foo($i){
2       return bar($i)*4;
3       function bar($i){
4           return $i*4;
5           }
6       }
7    echo foo(4);

返回
Fatal error: Call to undefined function bar() in /var/www/index.php on line 2

为什么它不起作用?在JavaScript中它可以正常工作,但是当我这样做时它就无法工作:
function foo($i){
   return bar($i)*4;
   }

function bar($i){
   return $i*4;
   }

第一个在JS中也不起作用。第二个在JS中也可以工作。(但请注意,第一个在PHP中不会创建本地范围的闭包,而只是一个全局函数,如果我没记错的话)。 - user395760
为什么你期望一个在一种语言中工作的东西,在另一种语言中也能够工作呢? - Felix Kling
3
因为 JavaScript 有变量提升,所以这个语句是有效的。函数和变量声明会被提升到函数顶部。 - Felix Kling
这在任何语言中都行不通... 在 return 后面的代码... - dynamic
@Felix:啊,是的。我总是忘记 var f = function () {}function f() {} 之间这个丑陋的不一致性(白日梦?)。 - user395760
6个回答

21

在返回值之前定义函数,否则它永远不会被执行。

<?php
function foo($i){
    function bar($i){
        return $i*4;
    }
    return bar($i)*4;
}
echo foo(4);
?>

是的,事件的顺序,我立即看到了。 - elliotrock

3

1
如果您在另一个函数内定义了一个函数,那么它可以直接访问,但是必须在调用父函数之后才能访问。 例如:
function a () {
    function b() {
    echo "I am b.";
   }
echo "I am a.<br/>";
}
//b(); Fatal error: Call to undefined function b() in E:\..\func.php on line 8
a(); // Print I am a.
b(); // Print I am b.

1

你的代码从未到达function bar(...),因此它从未被定义。

你需要在foo()return bar之前放置你的bar()函数。(基于你的第一个例子的答案)。

对于你的第二个例子,你可能在使用foo()之前定义了bar(),因此bar()被定义并且可以正常工作。

因此,只要在代码的某个特定位置调用函数时已经定义了该函数,它就可以正常工作,无论是否从另一个函数中调用。


0

return语句后未执行

请按如下方式更改您的代码

 function foo($i){
 function bar($i){
  return $i*4;
 }
 return bar($i)*4;     
}
echo foo(4);

0
为了有一个“最近”的答案,这是我所做的:
function printRx($conn, $patient)
{
    function rows($rows, $tod)
    {
        for ($x = 0; $x < count($tod); $x++) {
            if ($tod[$x] == 1) {
                $rows++;
                break;
            }
        }
        return $rows;
    }
    $tod['prn'] = (explode('|', $row['prn'])) ?? null;
    $rows = rows($rows, $tod['prn']);
    return;
}

运行得非常好


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接