8

我熟悉创建放置在 .php 文件顶部的 PHP 函数,例如:

function my_little_function($parm1,$parm2) {
   if ($parms < $parm2) {
   return "yes";
   } else {
   return "no";
   }
}

然后像这样调用它:

$result = my_little_function("1","2");
echo "The answer is $result." . "\n";

我有一些代码,不是我写的,它在上面的 my_little_function 这样的函数的传统用法中一起使用了“function”和“use”。

我对此感到困惑,并向更有经验的 PHP 开发人员提出一些问题。这是我所指的工作 PHP 代码的一部分:

$neededObject = array_filter($st_ny_trip->STOPS->STOP,function($e) use ($final_desired_dest,$connect_raw){return $e->NAME == $final_desired_dest && DateTime::createFromFormat("m/d/Y g:i:s a", $e->TIME) > $connect_raw;});

$e没有在函数的任何部分或程序的其余部分设置,那么使用的是什么$e?它如何传递一个值以及它是如何被使用的?这个函数似乎没有名字,所以我不知道它是如何被调用的,它是如何完成的?

这是创建一个函数,即时使用并且每次调用此代码时都会重新生成它?如果它是一个函数,为什么不在这个函数之外创建它并调用它呢?

我自己还没有使用过“使用”,所以这对我来说很陌生。我在 php.net 上查找了它,它看起来像是一种为某物赋值的方法,但我找不到任何实际示例来说明为什么需要它以及何时应该使用它。

我查了一下array_filter,它说它是“使用回调函数过滤数组的元素”。我不知道回调函数是什么。是指function($e)吗?

上面的 PHP 代码行是否应该采用$neededObject不同的格式以便于阅读?

4

2 回答 2

7

让我们array_map()用来解释发生了什么。

我们想复制一个数组的输入:所以如果输入是aa,那么输出就是aaaa

因此,通常的方法是创建一个函数,然后将其传递给array_map()

$array = range('a', 'e');

$new_array = array_map('duplicate', $array);
print_r($new_array);

function duplicate($string){
    return $string.$string;
}

在线演示

但是,如果您只想使用此功能一次怎么办?从PHP 5.3开始,有一种叫做匿名函数的东西,我们像下面这样使用它:

$array = range('a', 'e');

$new_array = array_map(function($string){
    return $string.$string;
}, $array);
print_r($new_array);

在线演示

现在,假设您想从另一个变量中添加一个标准值。使用全局变量很容易。但正如我们所知,全局变量是邪恶的,应该避免。我们可以使用use()

$array = range('a', 'e');
$standard_value = ',';

$new_array = array_map(function($string)use($standard_value){
        // $standard_value becomes available inside the function
    return $string.$standard_value.$string;
}, $array);
print_r($new_array);

在线演示

use()如果我们在循环时使用引用写入外部变量,也会变得有用:

$array = range('a', 'e');
$another_string = '';

$new_array = array_map(function($string)use(&$another_string){// note &
    $another_string .= $string.$string; // overwrite $another_string
    return $string.$string;
}, $array);
print_r($new_array);
echo PHP_EOL . $another_string;

在线演示

于 2013-08-12T09:18:49.520 回答
3

$e变量充当普通函数参数,因此将由调用函数的代码传递,有关$e使用时的值的文档,请参见文档array_filter

use语句将变量从本地范围导入匿名'函数'的范围。

$myvar = 'world';
$myFunc = function ($test) use ($myvar) {
    return $test . ' ' . $myvar;
};
echo $myFunc('hello'); // echoes 'hello world';

如果您没有包含该use ($myvar)部分,那么isset($myvar)将从匿名函数内部返回 false ,因为它具有单独的范围。

于 2013-08-12T09:03:01.990 回答