iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 14
0

概要

因為 Collection 提供的函式在官方教學都找的到介紹,
這個章節我會著重在 Collection 實作的幾個界面及引入的 trait。

Macroable

這個 Class 一樣可以透過 Collection::macro 來擴充。

Countable

這個界面需要實作一個 count() 函式。

等價的寫法

所以 Collection 除了一般的 $collection->count() 之外,
你也可以用 count($collection) 達成一模一樣的效果。

個人偏好

我個人也偏好用後者的用法,
雖然用前者可以明確標誌這個物件是一個 Collection ,
但有時候即使因為業務需求,
後方給出的資料是以 Array 呈現,在這邊的計算也不需要改動。

IteratorAggregate

這個界面要求實作 getIterator() 函式。
實作之後就可以讓你在 foreach 迭代實作這個界面的 Class~

在 Collection 裡面實作的方法是,
直接把 Class 內用於儲存 Collection 資料的關聯陣列傳給原生的 ArrayIterator
並回傳出去。

這邊看起來並沒什麼魔法~

Arrayable

這個界面是 Illuminate 提供的

實作這個界面的話...,這個 class 就會有一個 toArray() 函式,
可以把目前的 class 轉換成 array。

但要注意的是,
因為 Collection 的 toArray() 會針對底下的 elements 也執行 toArray()
所以如果你是多維的 Collection,每一層是都會被轉換成 Array 的!

Jsonable、JsonSerializable

這個界面是 Illuminate 提供的

一個是必須實作 toJson() 、另一個是必須實作 jsonSerialize()
因為在呼叫 $collection->toJson() 的時候,函式內部也會呼叫到 jsonSerialize()
所以兩者要一起看。

執行 toJson()

其中 jsonSerialize() 會依序做下列幾個檢查:

  1. $value instanceof JsonSerializable => $value->jsonSerialize()
  2. $value instanceof Jsonable => json_decode($value->toJson(), true)
  3. $value instanceof Arrayable => $value->toArray()

在第一步就會先把能轉成 json 的就轉成 json。
第三步把能轉換成 array 的轉換成 array 這種能直接被 json_encode() 的 class 也很好理解。

問題來了

到底在上面的第二步之中,
他先對 $value 呼叫 toJson()json_decode() 回來,
這樣子的用意何在呢?
/images/emoticon/emoticon06.gif

murmur

雖然會安排要寫這篇是因為之前有稍微研究過 Collection 與 Array 的關係...,
仔細的在看了一眼 Collection,
突然覺得也沒什麼好說的XD

這東西就是神阿,
又不像 PHP 的陣列函式各種陣列參數的位置不固定;又不用一層包一層,可以串著用~
即使我也是寫了不少篇原生陣列函式的介紹;
即使 Collection 也可以說是陣列的重新包裝,
但就真的是比較好用 XDD


上一篇
Laravel:深入Query/Builder
下一篇
Laravel:深入Schedule
系列文
花式PHP31

尚未有邦友留言

立即登入留言