簡體   English   中英

Laravel 集合 map 在同一個 class 中使用私有 function 而不是關閉

[英]Laravel collection map use private function in same class instead closure

我使用map function循環collections的每個object。關閉方法太長,我試圖將其設為私有function。但我無法成功調用function。

這是我的示例代碼。 (注意:function 測試在實際情況下可能會很長)

<?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]

我使用 function: run1 來測試私有 function 是否可調用,但我在 function: run2 失敗了。 雖然 function: run3 使代碼變短了。 似乎有些多余。 我怎樣才能使 run2 工作?

更新

我的Laravel版本是6.2

更新

我嘗試了@xenooooo 的回答。 它適用於公共 function,但我使用私有方法得到了不同的錯誤代碼。 在此處輸入圖像描述

簡單的回答: $this->test()需要一個參數,而你只是沒有傳遞任何東西給它。

您還可以修改run2/run3方法以執行以下操作:

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
}

您可以在此處閱讀有關 collections 的更多信息: https://laravel.com/docs/9.x/collections#introduction

run2中的問題是您直接調用該方法並且需要傳遞 an 參數,因為test需要參數$a 要將該方法用作回調 function,您需要將其作為數組傳遞,第一個值是$this ,第二個是方法名稱test

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

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

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

    return $newCollection;
}

更新

它僅在您將調用的方法是公共方法時才有效,如果您使用私有或受保護方法則它將無效。 如果你使用 private 或 protected if 將拋出BadMethodCallException

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM