因為 Collection 提供的函式在官方教學都找的到介紹,
這個章節我會著重在 Collection 實作的幾個界面及引入的 trait。
這個 Class 一樣可以透過 Collection::macro
來擴充。
這個界面需要實作一個 count()
函式。
所以 Collection 除了一般的 $collection->count()
之外,
你也可以用 count($collection)
達成一模一樣的效果。
我個人也偏好用後者的用法,
雖然用前者可以明確標誌這個物件是一個 Collection ,
但有時候即使因為業務需求,
後方給出的資料是以 Array 呈現,在這邊的計算也不需要改動。
這個界面要求實作 getIterator()
函式。
實作之後就可以讓你在 foreach 迭代實作這個界面的 Class~
在 Collection 裡面實作的方法是,
直接把 Class 內用於儲存 Collection 資料的關聯陣列傳給原生的 ArrayIterator
,
並回傳出去。
這邊看起來並沒什麼魔法~
這個界面是 Illuminate 提供的
實作這個界面的話...,這個 class 就會有一個 toArray()
函式,
可以把目前的 class 轉換成 array。
但要注意的是,
因為 Collection 的 toArray()
會針對底下的 elements 也執行 toArray()
,
所以如果你是多維的 Collection,每一層是都會被轉換成 Array 的!
這個界面是 Illuminate 提供的
一個是必須實作 toJson()
、另一個是必須實作 jsonSerialize()
。
因為在呼叫 $collection->toJson()
的時候,函式內部也會呼叫到 jsonSerialize()
,
所以兩者要一起看。
其中 jsonSerialize() 會依序做下列幾個檢查:
$value->jsonSerialize()
json_decode($value->toJson(), true)
$value->toArray()
在第一步就會先把能轉成 json 的就轉成 json。
第三步把能轉換成 array 的轉換成 array 這種能直接被 json_encode()
的 class 也很好理解。
到底在上面的第二步之中,
他先對 $value 呼叫 toJson()
又 json_decode()
回來,
這樣子的用意何在呢?
雖然會安排要寫這篇是因為之前有稍微研究過 Collection 與 Array 的關係...,
仔細的在看了一眼 Collection,
突然覺得也沒什麼好說的XD
這東西就是神阿,
又不像 PHP 的陣列函式各種陣列參數的位置不固定;又不用一層包一層,可以串著用~
即使我也是寫了不少篇原生陣列函式的介紹;
即使 Collection 也可以說是陣列的重新包裝,
但就真的是比較好用 XDD