Php 使用带有数组填充的匿名函数
所以我的目标是创建一个随机字母字符串,这些字母可以在字符串中重复。所以我想我可以聪明一点,这样做:Php 使用带有数组填充的匿名函数,php,anonymous-function,Php,Anonymous Function,所以我的目标是创建一个随机字母字符串,这些字母可以在字符串中重复。所以我想我可以聪明一点,这样做: $str = implode( array_fill(0,10, function(){ $c='abcdefghijklmnopqrstuvwxyz'; return (string)$c{rand(0,strlen($c)-1)}; } ) ); echo $str; 但我收到以下错误: 可捕获的致命错误:无法转换类闭包的对象 串入 这是我剧
$str = implode(
array_fill(0,10,
function(){
$c='abcdefghijklmnopqrstuvwxyz';
return (string)$c{rand(0,strlen($c)-1)};
}
)
);
echo $str;
但我收到以下错误:
可捕获的致命错误:无法转换类闭包的对象
串入
这是我剧本中唯一的东西,所以不,不是别的东西。现在,手册说明array\u fill
的第三个参数说明是“用于填充的值”,并将其列为接受混合类型。现在我知道“mixed”不一定等同于“any”类型,但对我来说,我应该能够使用匿名函数作为第三个参数,只要它返回字符串,这似乎是合理的,对吗?但显然我不能这么做
所以,我不一定要问为什么我不能这样做;这很可能归结为不在幕后将其写入代码的权力。但我想我只是想再次检查一下我的代码是否“正确”,如果php允许(但不允许),它“应该”工作,而不是我在其他地方搞砸了?如果没有函数的显式变体,没有理由期望函数执行回调,而不是简单地把它作为一个变量 让我们把逻辑分解一下:
// Declare the callback
$something = function(){
$c='abcdefghijklmnopqrstuvwxyz';
return (string)$c{rand(0,strlen($c)-1)};
}
不管这个函数做什么,我们现在有一个变量,它恰好是一个闭包
// 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);
现在,infrade()
必须生成一个字符串,因此在继续之前,它会将数组中的每个项转换为一个字符串。对于对象,它将尝试调用\uuu toString()
(对于内置对象,或等效的“引擎盖下”),但Closure
没有此类方法。这就是你的错误的来源
所以,不,您还没有完全搞砸,但是假设PHP会执行回调是不合理的,因为您知道这是您想要的
// Join up the items in the array to make a string
$str = implode($list);
正如注释中指出的,您可以使用
array\u map
执行回调;重复使用上面的$something
,并为清晰起见将其分解:
// 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();
}
$str='';
对于($i=0;$i),这可以通过和完成:
它将不起作用,因为您传递的是一个函数而不是一个值。除非执行该函数,否则该函数返回一个值并不重要。在此之前,它只是一个值的方法。您可以通过使用接受回调的函数来模拟您试图实现的目标:$str=introde(array\u map(function($value)){$c='abcdefghijklmnopqrstuvwxyz';return(string)$c{rand(0,strlen($c)-1)},array_fill(0,10,NULL));echo$str;
@MarkBaker是的,这基本上是我在等待回复时想到的。不过我会把答案交给IMSoP,因为a)你没有发布答案!并且b)他解释了错误的确切来源。谢谢!你的问题是关于错误的,@IMSoP已经回答了…我所做的只是提供了一个简单的替代方案来代替你的基本代码,但它实际上没有回答问题,所以不值得作为答案发布啊,谢谢你对我的解释错误的真正来源;这是有道理的。我想出了一个alt,很像马克的评论,但是你的解释帮助我晚上睡得更好,谢谢!还有,是的。我不知怎么想,做一些涉及回调的事情会更少代码,看起来更聪明,但是仅仅使用一个普通的l会少很多代码哎哟,$str.=…
我想我只是在尝试变得聪明的时候被迷住了:/啊,是的,聪明和时尚的诱惑与简洁和简单的诱惑,我很清楚!)