PHP-使用匿名函数与array_fill
作者:互联网
因此,我的目标是创建一个随机字母字符串,并且字母可以在字符串中重复.所以我想我可以很聪明,做到这一点:
$str = implode(
array_fill(0,10,
function(){
$c='abcdefghijklmnopqrstuvwxyz';
return (string)$c{rand(0,strlen($c)-1)};
}
)
);
echo $str;
但是我收到以下错误:
Catchable fatal error: Object of class Closure could not be converted
to string in …
从字面上看,这是我脚本中唯一的事情,所以不,不是别的.现在,手册指出array_fill的第3个arg描述为“用于填充的值”,并被列为接受混合类型.现在我知道“ mixed”不一定等于“ any”类型,但是对我来说,只要它返回字符串,我就应该能够将匿名函数用作第三个arg,对吗?但是显然我做不到.
因此,我并不一定要问为什么我不能这样做.它很可能归结为强大的功能-就是根本不将其写入后台代码.但是我想我只是想仔细检查一下我是否正确执行了这段代码,如果php允许它“应该”可以工作(但不允许这样做),那么也许我以某种方式弄乱了其他地方?
解决方法:
如果没有该函数的显式变体,则没有理由期望函数执行您的回调,而不是简单地将其保留为变量.
让我们分解一下逻辑:
// Declare the callback
$something = function(){
$c='abcdefghijklmnopqrstuvwxyz';
return (string)$c{rand(0,strlen($c)-1)};
}
无论此函数做什么,我们现在都有一个恰好是Closure的变量.
// Fill the array
$list = array_fill(0,10,$something);
现在,阵列中已满了10个$something副本.碰巧是我们关闭的10个指针. PHP没有理由认为这不是您想要的.
// Join up the items in the array to make a string
$str = implode($list);
现在,implode()必须创建一个字符串,因此它将继续处理之前将数组中的每个项目转换为字符串.对于一个对象,它将尝试调用__toString()(或对于内置对象而言等效的“在幕后”),但是Closure没有这种方法.这是您的错误出处.
因此,不,您并没有完全搞砸,但是仅仅因为您知道这就是您想要的,就认为PHP将执行回调是不合理的.
正如Mark Baker在注释中指出的那样,您可以使用array_map执行回调;从上面重复使用$,然后为了清楚起见将其分解:
// Create 10 items, with nothing interesting in them
$list_of_nulls = array_fill(0, 10, null);
// Run the callback for each item of that list
// It will be given the current value each time, but ignore it
$list = array_map($something, $list_of_nulls);
// Now you have the list you wanted to join up
$str = implode($list);
当然,您也可以在一个循环中运行该函数10次:
$str = '';
for ( $i=0; $i<10; $i++ ) {
$str .= $something();
}
标签:anonymous-function,php 来源: https://codeday.me/bug/20191122/2057147.html