编程语言
首页 > 编程语言> > PHP-使用匿名函数与array_fill

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