ทำไมต้องมี interface iterator ก็เหมือนกับบทความก่อนหน้านี้ที่เราต้องการให้ object ที่เราสร้างขึ้นสามารถใช้งานฟังก์ชั่น count ได้เหมือนกับ array เราจะใช้ interface ที่ชื่อว่า countable ในตอนนี้เราก็เลยอยากจะให้ object ที่เราสร้างขึ้นสามารถใช้งาน foreach loop ดูบ้าง
ทบทวนเรื่อง interface กันก่อน ในการเขียน PHP แบบ Object-Oriented หรือ OOP เราจำเป็นต้องรู้จักการใช้งาน interface เพราะจุดประสงค์ของ interface คือการเป็นจุดเชื่อมต่อของ code 2 ส่วนถ้าเราไม่มี interface เข้ามาคั่นกลางเราจะไม่สามารถแยก 2 ส่วนนี้ออกจากกันได้ เช่นการที่เราใช้ interface iterator จะเป็นจุดเชื่อมต่อของ code 2 ส่วนคือคำสั่ง foreach(ซึ่งเป็นของ PHP เอง) และ object ของเรา ดังนั้นจะเห็นว่าถ้าเราอยากได้ object ตัวไหนทำงานกับ foreach ได้ เราก็แค่ implement interface ที่ชื่อว่า iterator แค่นี้เอง แล้ว iterator จะบอกเราเองว่า เราต้อง implement method หรือ function อะไรบ้าง (เราสามารถเอา object ของเราไปทำงานกับ foreach ได้โดยที่ไม่ต้องเข้าไปแก้ไข code ของ PHP นี่คือประโยชน์ของ interface)
คราวนี้ก็มาเริ่มต้นใช้งาน interface iterator โดยเริ่มจาก
1 2 3 |
class Customer implements Iterator { ..... } |
ต่อจากนั้นให้ implement method 5 method นี้
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
class Customer implements Iterator { // ส่วนนี้จะเป็นส่วนของการกำหนดค่าเริ่มต้น เพื่อใช้เป็นตัวอย่าง ในชีวิตจริงอาจเป็นข้อมูลที่ได้มาจาก Database หรือแหล่งอื่นๆ // และเราอาจใช้ Data structure อื่นๆอย่าง Dictionary แทน Array ก็ได้ private $position = 0; private $array = array( "John", "Jenny", "Martin", ); // Method ที่จำเป็นต้องมีเนื่องจาก Implement Iterator // ทำงานครั้งแรกก่อนจะเข้า loop ครั้งเดียว เป็นการกำหนดค่าเริ่มต้น function rewind() { $this->position = 0; } // ทำงานตอนที่จะดึงค่า value ทุกรอบ function current() { return $this->array[$this->position]; } // ทำงานตอนที่จะดึงค่า key ทุกรอบ function key() { return $this->position; } // หลังจากที่เราดึง value ออกมาแล้วจะเข้า method นี้เพื่อเลื่อนไปยัง สมาชิกตัวถัดไป function next() { ++$this->position; } // ทำงานหลังจาก next เพื่อทำการตรวจสอบว่ายังมีสมาชิกอยู่อีกหรือไม่ function valid() { return isset($this->array[$this->position]); } } |
เพราะฉะนั้นในรอบแรกจะเข้า
- rewind
- valid
- current (ถ้ามีข้อมูล)
- key(ถ้ามีข้อมูล)
หลังจากนั้นรอบอื่นๆ ก็จะเป็น
- next
- valid
- current
- key
จนรอบสุดท้ายก็จะทำงานแค่ 2 method เท่านั้น
- next
- valid
สุดท้ายเราก็สามารถใช้ obj ที่เกิดจาก Customer Class กับ foreach ได้แบบนี้
1 2 3 4 5 6 |
$customer = new Customer; foreach($customer as $key => $value) { var_dump($key, $value); echo "\n"; } |

ติดต่อสอบถามรายละเอียดเพิ่มเติมได้ที่ 062-419-9498
หรือ E-mail: training@irobust.co.th