我使用map函数来循环集合中的每个对象。闭包方法太长了,我试图将其变成私有函数。但是我无法成功调用该函数。
下面是我的示例代码。(注意:在实际情况下,功能测试可能会很长)
<?php
class cls
{
private function test($a) {
return ($a + 1);
}
public function run1() {
return ($this->test(5));
}
public function run2() {
$col = Collect([1,2,3]);
return ($col->map($this->test()));
}
public function run3() {
$col = Collect([1,2,3]);
$mycls = $this;
return ($col->map(function ($c) use ($mycls) {
return($mycls->test($c));
}));
}
}
$c = new cls;
$c->run1(); # 6
$c->run2(); # Error: Too Few Argements
$c->run3(); # [2,3,4]
我使用函数:run1测试私有函数是否可调用,并且我在函数:run2.虽然函数:run3使代码变短了。它看起来有点多余。我怎样才能使run2工作呢?
更新
我的版本是6.2
更新
我尝试了@xenooooo的答案。它可以在公共函数中工作,但是我在私有方法中得到了不同的错误代码。
2条答案
按热度按时间ylamdve61#
简单的答案:
$this->test()
需要一个参数,而您只是不向它传递任何东西。您还可以修改run 2/run 3方法以执行以下操作:
结果:
您可以在此阅读更多关于收藏的信息:https://laravel.com/docs/9.x/collections#introduction
1aaf6o9v2#
run2
中的问题是,您直接调用该方法,需要传递参数,因为test
需要参数$a
。要将该方法用作回调函数,需要将其作为数组传递,其中第一个值为$this
,第二个值为方法名test
:它只在你要调用的方法是公共的时才有效,如果你使用私有的或受保护的方法,它就不起作用。如果你使用私有的或受保护的if,它将抛出一个
BadMethodCallException