PHP 5.3提供匿名功能 我应该使用它们还是避免使用它们?如果是这样,怎么样?
被修改;刚刚用php匿名函数找到了一些不错的技巧......
$container = new DependencyInjectionContainer();
$container->mail = function($container) {};
$conteiner->db = function($container) {};
$container->memcache = function($container) {};
答案 0 :(得分:88)
Anonymous functions在使用需要callback function或array_filter
array_map
的函数时非常有用:
$arr = range(0, 10);
$arr_even = array_filter($arr, function($val) { return $val % 2 == 0; });
$arr_square = array_map(function($val) { return $val * $val; }, $arr);
否则你需要定义一个你可能只使用一次的函数:
function isEven($val) { return $val % 2 == 0; }
$arr_even = array_filter($arr, 'isEven');
function square($val) { return $val * $val; }
$arr_square = array_map('square', $arr);
答案 1 :(得分:24)
PHP 5.3提供匿名函数。
PHP中已经提供了很长时间的匿名函数:自PHP 4.0.1起,create_function就已存在。但是,从PHP 5.3开始,您可以使用新的概念和语法。
我应该使用它们还是避免使用它们?如果是这样,怎么样?
如果您以前使用过create_function
,那么新语法可以简单地在您使用它的地方滑动。正如其他答案所提到的,常见的情况是“一次性”功能,它们只能使用一次(或至少在一个地方)。通常以array_map / reduce / filter,preg_replace_callback,usort等内容的回调形式出现。
使用匿名函数计算字母在单词中出现的次数的示例(这可以通过其他方式完成,这只是一个示例):
$array = array('apple', 'banana', 'cherry', 'damson');
// For each item in the array, count the letters in the word
$array = array_map(function($value){
$letters = str_split($value);
$counts = array_count_values($letters);
return $counts;
}, $array);
// Sum the counts for each letter
$array = array_reduce($array, function($reduced, $value) {
foreach ($value as $letter => $count) {
if ( ! isset($reduced[$letter])) {
$reduced[$letter] = 0;
}
$reduced[$letter] += $count;
}
return $reduced;
});
// Sort counts in descending order, no anonymous function here :-)
arsort($array);
print_r($array);
这给出了(为简洁起见):
Array
(
[a] => 5
[n] => 3
[e] => 2
... more ...
[y] => 1
)
答案 2 :(得分:9)
也许您可以在Anonymous Functions上阅读PHP的文章。它实际上非常好。
答案 3 :(得分:4)
匿名函数在将函数创建到DI容器中非常有用,例如“bootstrap.php”:
//add sessions
$di->add("session",function(){ return new Session(); });
//add cache
$di->add("cache",function(){ return new Cache(); });
//add class which will be used in any request
$di->add("anyTimeCalledClass", new SomeClass());
使用参数和下一个变量的示例
$di->add("myName",function($params) use($application){
$application->myMethod($params);
});
所以在这里你可以看到如何使用匿名函数来节省内存和加载服务器。您可以在di
容器中定义所有重要的插件,类,但只要您需要就可以创建实例。
答案 4 :(得分:2)
匿名函数的典型用法是回调函数。例如,您可以将它们用于排序算法(例如函数uksort
(http://lv.php.net/uksort)中的回调或替换preg_replace_callback
(http://lv.php.net/manual/en/function.preg-replace-callback.php)等算法。
没有在PHP中自己尝试过,所以这只是猜测。
答案 5 :(得分:0)
以下是在Php中使用匿名函数的示例示例
$suppliers=['add1'=>'nodia','add2'=>'delhi', 'add3'=>'UP'];
$getAddress = function($suppliers){ $address=[];
for($i=1;$i<5;$i++){
if(array_key_exists('add'.$i, $suppliers))
$address[]=$suppliers['add'.$i];
}
return $address;};
print_r($getAddress($suppliers));
在上面的例子中,我们编写了匿名函数,用于检查输入数组中是否存在键。如果它存在,那么它将把它放入输出数组。