Laravel集合Map在同一类中使用私有函数而不是闭包

wqsoz72f  于 2023-01-14  发布在  其他
关注(0)|答案(2)|浏览(98)

我使用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的答案。它可以在公共函数中工作,但是我在私有方法中得到了不同的错误代码。

ylamdve6

ylamdve61#

简单的答案:$this->test()需要一个参数,而您只是不向它传递任何东西。

您还可以修改run 2/run 3方法以执行以下操作:

public function run2() {
   $col = collect([1,2,3])->map(function ($value) {
      return $this->test($value);
   });
        
   return $col; //returns a collection of items
   //return $col->toArray(); //(extra option) returns an array of collected items
}

结果:

Illuminate\Support\Collection {#872 ▼ 
  #items: array:3 [▼
    0 => 2
    1 => 3
    2 => 4
  ]
  #escapeWhenCastingToString: false
}

您可以在此阅读更多关于收藏的信息:https://laravel.com/docs/9.x/collections#introduction

1aaf6o9v

1aaf6o9v2#

run2中的问题是,您直接调用该方法,需要传递参数,因为test需要参数$a。要将该方法用作回调函数,需要将其作为数组传递,其中第一个值为$this,第二个值为方法名test

public function test($a) {
    return ($a + 1);
}

public function run2()
{
    $collection = collect([1,2,3]);

    $newCollection = $collection->map([$this,'test']);

    return $newCollection;
}
    • 更新**

它只在你要调用的方法是公共的时才有效,如果你使用私有的或受保护的方法,它就不起作用。如果你使用私有的或受保护的if,它将抛出一个BadMethodCallException

相关问题