PHP中的'function'、'use'和'array_filter'是如何工作的?

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";

我有一些代码,不是我写的,在像上面这样的传统函数使用中,同时在内部使用“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?它如何传递值并被使用?这个函数似乎没有名称,所以我不知道它是如何被调用的,这是怎么做到的?

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

我自己还没有使用过 'use',所以对我来说很陌生。我在php.net上查找了它,它只是一种将值分配给某个变量的方式,但我找不到任何实际的示例来说明为什么需要它以及应该在何时使用。

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

应该将上面的PHP代码行格式化得更易于阅读吗?


1
http://php.net/manual/en/functions.anonymous.php - NDM
PHP非常棒,它在array_map()array_filter()中有不同的参数顺序。PHP会告诉你是否做错了,但还是很奇怪。 - Rudie
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;

在线演示


4

$e变量作为普通的函数参数,因此将被调用函数的代码传递,使用array_filter时,请参阅文档以获取$e的值。

use语句将变量从本地作用域导入到匿名函数的作用域中。

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

如果您没有包含use ($myvar)部分,那么从匿名函数内部调用isset($myvar)将返回false,因为它有一个单独的作用域。

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