在PHP中在函数内声明一个函数

8

代码:

public function couts_complets($chantier,$ponderation=100){

    function ponderation($n)
    {
        return($n*$ponderation/100); //this is line 86
    }

            ...

    }

我想做的事情是:在函数A中声明一个函数B,以便将其用作array_map()的参数。
我的问题是:我遇到了一个错误:
Undefined variable: ponderation [APP\Model\Application.php, line 86]

文档似乎说得不一样:http://www.php.net/manual/en/functions.user-defined.php - L. Sanna
@Tomalak,它会“工作”,该函数只是全局声明。 - salathe
我明白了。是的,你发现了全局变量的限制。这确实证明了@salathe所说的是正确的,但这与你所说的完全不同,正如我在第二条评论中试图解释的那样。但这并没有真正带来任何有用的东西,你确实展示了一个问题,虽然我不会称之为“它不起作用”,但似乎你会这么说。让我们就此结束吧。 - Nanne
1
@Tomalak,既然这种“破碎的”行为已经被观察到、记录下来*,并且自 PHP 诞生以来就一直保持不变,这事实强烈反对你认为这个特性只是一个偶然的意见。我们并没有那么关注向后兼容性。 - salathe
在另一个函数内声明函数并没有问题,但这容易出错...你必须先调用外部函数再调用内部函数,而且调用内部函数两次会导致致命错误。 - mercury
显示剩余14条评论
4个回答

12

试试这个:

public function couts_complets($chantier,$ponderation=100){

    $ponderationfunc = function($n) use ($ponderation)
    {
        return($n*$ponderation/100);
    }

        ...
    $ponderationfunc(123);
}

2

从php 5.3开始,您可以使用匿名函数。您的代码将如下所示(未经测试的代码警告):

public function couts_complets($chantier,$ponderation=100) {
    array_map($chantier, function ($n) use ($ponderation) {
        return($n*$ponderation/100); //this is line 86
    }
}

2

在您当前的代码中,$ponderation不在函数的作用域内,因此会出现“未定义”的错误。

要将变量传递给“内部”函数,请使用 use 语句。

function ponderation($n) use($ponderation) {

嗯,可能吧。无论如何,在这种情况下,我认为该方法应该被重写为匿名函数。 - FThompson
这仅仅在匿名函数的文档页面中提到,而不在常规用户定义函数的页面中。 - Maerlyn

1

使用回调函数:

为了在PHP中将一个函数作为参数使用,只需将函数的名称作为字符串传递即可:

array_map('my_function_name', $my_array);

如果该函数实际上是类中的静态方法,您可以将其作为参数传递,如下所示:

array_map(array('my_class_name', 'my_method_name'), $my_array);

如果该函数实际上是类中的非静态方法,则可以将其作为参数传递,如下所示:

array_map(array($my_object, 'my_method_name'), $my_array);

声明回调函数:

如果您在全局空间中声明,那么对于每个人来说都是好的和清晰的。

如果您将其声明在另一个函数内部,则它将是全局的,但在父函数第一次运行之前不会被定义,并且如果再次运行父函数,则会触发错误Cannot redefine function my_callback_function

如果您将其声明为lambda函数/匿名函数,则需要指定允许其查看/使用哪些上层作用域变量。

调用回调函数:

function my_api_function($callback_function) {
    // PHP 5.4:
    $callback_function($parameter1, $parameter2);

    // PHP < 5.3:
    if(is_string($callback_function)) {
        $callback_function($parameter1, $parameter2);
    }
    if(is_array($callback_function)) {
        call_user_func_array($callback_function, array($parameter1, $parameter2));
    }
}

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