• PHP

    OOP ซีรี่ย์ – Abstract classes & methods

    Abstract class นั้นเป็นคลาสที่ถูกเขียนขึ้นมาด้วยความตั้งใจว่า “เป็นการวางโครงคลาสไว้ให้ก่อน เมื่อจะนำไปใช้ คุณจะต้อง implement มันให้เป็นคลาสเสียก่อน” วิธีการสร้างก็เหมือนการคลาสปกติ เพียงแต่นำหน้าคลาสด้วยคีย์เวิร์ด Abstract ผมเอาตัวอย่างจริงๆของ WooCommerce มาให้ดู เพื่อจะให้เห็นว่าคอนเซ็ปนี้เขาไม่ได้สร้างกันขึ้นมาเล่นๆ View the code on Gist. เวลาจะเอาคลาส WC_CSV_Exporter ไปใช้งาน เราจะต้องทำการ implement มันให้เป็นคลาสเสียก่อน ด้วยคำสั่งนี้        

    READ MORE
  • เพราะชีวิตไม่ได้มีแค่เรื่องเขียนโปรแกรม

    Codemate การทำงานแบบชาวฟินแลนด์

    เราสั่งซื้อโต๊ะพูลมาติดตั้งที่ชั้น 30 แล้ว น่าจะอีกสัปดาห์หรือสองสัปดาห์เขาจะมาติดตั้งให้

    READ MORE
  • PHP

    OOP ซีรี่ย์ – override properties and methods

    ในกระบวนการของ OOP นั้นมันยอมให้คลาสลูกที่สืบทอดไปจากคลาสแม่ เขียนทับฟังก์ชั่นของตัวแม่ได้ เหตุผลหนึ่งที่ยอมให้กระทำอย่างนั้นได้ เพราะว่า เผื่อเราต้องการจะเปลี่ยนแปลงการทำงานของฟังก์ชั่นบางฟังก์ชั่น สมมติ เรามีคลาสอยู่ตัวหนึ่งซึ่งเราตั้งใจให้มันเป็นคลาสหลักให้คลาสอื่นๆมา extends ออกไปแล้วเขียนฟังก์ชั่นเพิ่มให้แตกต่างกันไป ทีนี้ระบบมันก็ใช้มาๆ แล้ววันหนึ่งเราต้องการสร้างคลาสตัวหนึ่งที่จะต้อง extends มาจากคลาสหลัก แต่ อยากแก้ไขฟังก์ชั่นที่มีอยู่เดิมให้ทำงานแตกต่างออกไป แบบนี้ทำได้ ดูตัวอย่าง View the code on Gist. ถ้าเราประกาศฟังก์ชั่นด้วยคีย์เวิร์ด public มันจะอนุญาติให้เราเขียนฟังก์ชั่นทับอย่างนี้แหละ  แต่ถ้าเราไม่อยากให้มีการเขียนทับฟังก์ชั่น เราจะต้องใช้คีย์เวิร์ด final วางไว้หน้าฟังก์ชั่น แล้ว PHP มันจะไม่อนุญาติให้เขียนฟังก์ชั่นทับเอง ทีนี้บางคนอาจจะสงสัยว่า ก็เราเขียนเอง ทำไมต้องไฟน่งไฟนอล เอ้าก็ภาษามันไม่ได้ออกแบบมาเพื่อให้คนๆเดียวเขียนเท่านั้น มันอาจจะมีฝ่ายวางแผน ฝ่ายขึ้นโครงคลาส พวกสร้างคลาสให้แล้วคนอื่นเอาไปเขียนต่อ ซึ่งมันจำเป็นต้องป้องกันบางอย่างที่อาจจะก่อให้เกิดบัก ตัวอย่างข้างล่างนี่เออเร่อ เพราะตรงบรรทัดที่ 12 มีการใส่ final ไว้หน้าฟังก์ชั่น getID นั่นหมายความว่า ห้ามใคร implement ฟังก์ชั่นนี้ใหม่ในคลาสลูก View the […]

    READ MORE
  • PHP

    OOP ซีรี่ย์ – Inheritance in PHP

    Inheritance หรือเรียกอย่างไทยๆว่าการสืบทอด การสืบทอดมันไม่ได้มีอะไรใกล้เคียงกับตั๊กแตนทอดหรือกล้วยทอด หรืออะไรอย่างอื่นที่ใช้น้ำมันเป็นส่วนประกอบกรรมวิธี พอกล่าวถึงเรื่องน้ำมัน ก็อยากจะบอกว่าน้ำมันปาล์มไว้ใช้ทอด น้ำมันถั่วเหลืองไว้ใช้ผัด ไปเรื่อย… การสืบทอดใน OOP นั้นจะคล้ายๆกับการก้อปปี้โค้ดเดิมแล้วเอามาเขียนโค้ดต่อเพิ่มเข้าไป ที่ผมใช้คำว่าคล้าย เพราะว่าการสืบทอดนั้นมันเจ๋งกว่าการก้อปปี้ สมมติว่าผมมีคลาสอยู่ตัวหนึ่ง ทำงานได้ดี View the code on Gist. คลาสตัวนี้เอาไปใช้ในโค้ดหลายๆที่ นานไปๆก็จำไม่ได้แล้วว่าเอาไปใช้ตรงไหนบ้าง แต่ไม่เป็นไรเพราะระบบยังใช้งานได้ดี วันหนึ่งเราอยากจะได้ฟังก์ชั่นสำหรับดึงค่า idcard ออกมา แต่มันก็ใช้อยู่ที่เดียวเท่านั้น ในโค้ดใหม่ ทางเลือกที่เรามีอยู่ตอนนี้ก็คือ ก้อปปี้คลาสนี้ทั้งคลาสเลยแล้วเปลี่ยนชื่อเสียใหม่แล้วเพิ่มโค้ด / หรือแก้คลาสเดิมเลยเพิ่มโค้ดใหม่เข้าไป 2 ทางเลือกที่ให้มาถ้าเป็นระบบจริงๆมีเสียวกันบ้าง เพราะการแก้โค้ดเดิม ไม่รู้ว่ามันจะไปกระทบกับของเก่าที่นำไปใช้บ้างหรือเปล่า หากคุณเขียนโค้ดแบบ functional นะ ไม่ใช้ class นะ ทางเลือกคุณมี 2 ทางนั้นแหละ แต่คลาสเขาออกแบบมาให้มันรองรับการสืบทอด เราเขียนคลาสใหม่สืบทอดจากคลาสเก่าแล้วเติมโค้ดใหม่เข้าไป ดอตอยอ ดูตัวอย่าง View the code on Gist. คลาส […]

    READ MORE
  • PHP

    OOP ซีรี่ย์ – Magic methods

    เมจิกเมธอด ชื่อมันก็บอกอยู่แล้วว่าเป็นเมธอดมหัศจรรย์ มหัศจรรย์ยังไง ก็มหัศจรรย์ว่ามันจะรันของมันอัตโนมัติ เมจิกเมธอดนี้จะมีอยู่ 2 เมธอด คือ __construct() : จะถูกเรียกอัตโนมัติเมื่อคลาสนั้นถูก new โดยปกติเขาจะไว้ใช้สำหรับเตรียมตัวแปรหรืออะไรเทือกๆนั้น __deconstruct() : จะถูกเรียกอัตโนมัติเมื่อโค้ดถูกรันหมดหน้า ปกติเขาจะไม่เขียนเมธอดนี้กัน เอ้าทำไม ก็เพราะว่าเขียนหรือไม่เขียนก็ค่าเท่ากัน PHP นั้นมันมีระบบที่เรียกว่า เรียกว่าเหี้ยอะไรสักอย่างนี่แหละ หน้าที่ของมันก็คือมันจะทำลายตัวแปรทั้งหมดทิ้งเมื่อรันโค้ดหมดหน้าและส่งไปแสดงผลแล้ว เพื่อไม่ให้เกิดอาการที่เขาเรียกว่าหน่วยความจำรั่ว หรือเรียกเอาเท่ว่า memory leak ตัวอย่างการเขียนจะเป็นแบบนี้ View the code on Gist. เมื่อมีการ new คลาส People ฟังก์ชั่น __construct() จะถูกรันอัตโนมัติ  

    READ MORE
  • PHP

    OOP ซีรี่ย์ – Public vs. Private

    สองคีย์เวิร์ดนี้ public, private เขาไว้สำหรับกำหนดขอบเขตการเข้าถึงฟังก์ชั่นหรือตัวแปรภายในออบเจ็ก ดอตอยอ View the code on Gist. ตอนพระเจ้าสร้างออบเจ็กขึ้นมา พระเจ้าจะกำหนดไว้แล้วว่า ฟังก์ชั่นไหนไม่ให้เรียกจากภายนอก ฟังก์ชั่นไหนให้เรียกจากภายนอกได้และเรียกจากภายในก็ได้ เหตุผลที่ทำอย่างนี้น่ะเหรอ ก็เพื่อจำกัดกรอบของบักให้แคบลง หรือไม่งั้นก็อาจจะเพราะอินดี้ก็ได้ เอ้า… ทำไมอะเราไม่ให้เรียกใช้ฟังก์ชั่นนี้จากภายนอกอะ เราผิดเหรอ ผมเคยเจอบ่อย ตอนที่เขียนปลักอินติดต่อกับวูคอมเมิร์ส เรียกฟังก์ชั่นไป ตอบกลับเออเร่อมาว่าฟังก์ชั่นนี้ไม่ให้เรียกจากภายนอก เป็น private อะไรอะ… ลองเข้าไปอ่านโค้ดของวูคอมเมิร์สดูก็ไม่น่าจะต้องจำกัดสิทธิ์การเข้าถึง ผมถึงบอกว่าบางทีก็เพราะพระเจ้าอินดี้ ก็แล้วแต่แหละ เขียนๆไปมีประสบการณ์เยอะๆ จะรู้เองว่า อ๋อฟังก์ชั่นนี้เราใช้ส่วนตัวภายในก็พอ เอาล่ะมาดูการเรียกใช้งานจากคลาสข้างบน View the code on Gist. เราจะได้ตัวแปร name เท่ากับ Watcharamet Srinethirothai แต่ถ้าเราเรียกอย่างนี้ เออเร่อเลยนะครับ View the code on Gist. มันจะเออเร่อตรงบรรทัด 29 เพราะว่าในคลาสประกาศฟังก์ชั้น changeName() […]

    READ MORE
  • PHP

    OOP ซีรี่ย์ – Chaining methods

    Chaining-methods จะว่ามันเป็นคุณสมบัติอันโดดเด่นของ OOP ก็ไม่ใช่ซะทีเดียว มันเป็นแค่เทคนิค ถ้าท่านเคยใช้พวกเฟรมเวิร์คมาก่อนท่านจะคุ้นกับ ตอยอ ตัวอย่างนี้มาก View the code on Gist. การเรียกเมธอดต่อๆกันเป็นแบบลูกโซ่อย่างนี้ เห็นได้ทั่วไปเมื่อท่านใช้เฟรมเวิร์ค มันดูง่าย มันดูเป็นระเบียบ มันดูล้ำ ผมเขียน laravel มาก่อน เห็นการเขียนลักษณะนี้จนชิน และผมก็เขียนอย่างนี้เหมือนกัน แต่ไม่เคยตั้งคำถามว่าไอ้คนทำเฟรมเวิร์คมันทำได้อย่างไรให้เราสามารถเรียกฟังก์ชั่นต่อๆกันแบบนี้ มีเฉลย ง่ายๆกากๆเลย ดูในโค้ดตรงคำสั่ง return มัน return $this; ซึ่งมันจะคืนค่ากลับไปเป็น object ตัวมันเอง เพราะฉะนั้นมันก็สามารถเรียกฟังก์ชั่นอื่นต่อๆไปได้ View the code on Gist. อ๋อ อย่างนี้นี่เอง

    READ MORE
  • PHP

    OOP ซีรี่ย์ – The $this keyword

    สั้นๆง่ายๆ คำว่า $this นี่ไว้ใช้สำหรับเรียกฟังก์ชั่นหรือตัวแปรภายในคลาส  ดอตอยอ ดูตัวอย่าง View the code on Gist. แค่นี้แหละ ไม่มีคำอธิบายมากกว่านี้ เพราะหน้าที่มันมีแค่นี้ ถามว่าทำไมไม่เรียกมันตรงๆ คือไม่ต้องมี $this-> มาคั่นข้างหน้าน่ะ? จากคำอธิบายที่อ่านๆมา เขาบอกว่า เอาคำว่า $this-> มาคั่นหน้าฟังก์ชั่นหรือตัวแปรสักหน่อย เพื่อจะได้สังเกตุง่ายๆว่า เนี่ยตัวแปรนี้มันอยู่ในคลาสนี่แหละ เนี่ยฟังก์ชั่นนี้มันอยู่ในคลาสนี่แหละ ไม่ต้องไปหาไกล มันบอก scope พี่ ซาโขบบบบบบ ใจ๋ ผมว่านะถ้าเขาจะทำให้ไม่ต้องมี $this-> เขาก็น่าจะทำได้นะ ตอนสร้างภาษา แต่จากเหตุผลที่เขาให้มา ผมยอมรับได้นะ ที่บอกว่าเพื่อให้เราหาฟังก์ชั่นได้ง่ายขึ้น เพราะรุ้ว่ามันอยู่ในคลาสนี้ ผมให้ผ่าน คุณลองนึกถึงภาพระบบใหญ่ๆที่มัน include ไฟล์เข้ามาทีเป็นสิบ หาฟังก์ชั่นกันมึน ว่ามันมาจากไฟล์ไหน เอาล่ะมีข้อสังเกตให้สังเกตุ View the code on Gist. ตัวแปรเมื่อถูกเรียกด้วย $this จะไม่มี […]

    READ MORE
  • General

    OOP ซีรี่ย์ – Classes and objects

    เมื่อเราย่างเท้าเข้าสู่โลกของการเขียนโปรแกรมเชิงวัตถุ (อูววววว) คำที่เราจะได้ยินจนชำนาญคือคำว่า class และ object คลาสก็คือโค้ดก้อนหนึ่งที่ถูกหุ้มด้วยคำว่า  class View the code on Gist. ถ้าจะอธิบายตามหลักการก็คือ ให้เราจินตนาการทุกอย่างที่จะเกิดขึ้นในระบบเราเป็นคน เช่น ถ้าหากในระบบเราจะต้องมีอะไรที่ทำเกี่ยวข้องกับไฟล์ เราก็สร้างคนๆหนึ่งขึ้นมาในจินตนการชื่อว่า ไอ้ฟาย ไอ้ฟายนี่จะทำหน้าที่ทุกอย่างที่เกี่ยวข้องกับไฟล์ ใครอยากสร้างไฟล์ให้เรียกไอ้ฟาย ใครอยากได้พาธของไฟล์ถามไอ้ฟาย  ซึ่งถ้าหากมีคำถามว่า แล้วเราจะให้ไอ้ฟายมันทำอะไรได้บ้าง  ตอบได้อย่างเดียวเลย จะไปรู้เรอะ ในงานเขียนโปรแกรมคุณคือพระเจ้าที่จะสร้างให้คนๆนั้นทำไอ้นี่ได้ ทำไอ้นี่ไม่ได้ แล้วพระเจ้าดูจากไหนว่าจะต้องให้ไอ้ฟายมันทำอะไรได้บ้าง ก็ดูเอาจากว่าโปรแกรมมันต้องการอะไรบ้าง ถ้าโปรแกรมที่เขียนไม่ได้มีการอัปโหลดไฟล์ ก็ไม่ต้องเขียนโค้ดให้ไอ้ฟายมันอัปโหลดได้ ไม่ต้อง เขียนเผื่ออนาคตได้มั้ย! ไม่ต้อง คำว่าเผื่ออนาคตคือขยะ เอาเวลาไปนั่งเกาไข่เถอะ แล้ว object คืออะไร? object คือตัวแปรที่ใช้คำสั่ง new มาจาก class  ให้คิดเสียว่า class มันคือต้นแบบเอาไปใช้ตรงๆไม่ได้ (ถามว่าทำไมไม่ได้ เอ้า ก็คนออกแบบภาษาเขากำหนดมางั้น เรามันผู้ตาม ทำตัวเชื่องๆ) ต้องก้อปปี้ไปใช้ผ่านคำสั่ง new […]

    READ MORE
  • PHP

    OOP ซีรี่ย์

    นับจากบทความบทนี้ไปผมจะเขียนเรื่อง OOP ให้อ่านซึ่งได้รับแรงบันดาลใจมาจาก http://phpenthusiast.com/object-oriented-php-tutorials  เขาเขียนอธิบายเรื่องราวของ OOP ได้อ่านง่าย เลยคิดว่า กูเอามั่ง หัวข้อที่จะเขียนทั้งหมดมีอยู่ตามนี้  หากใครเข้ามาอ่านแรกๆมันจะไม่มีลิ้งก์นะครับ ต่อเมื่อผมเขียนเรื่องราวนั้นๆแล้ว จะมาแก้หน้านี้แล้วทำลิ้งก์แต่ละหัวข้อไปยังเนื้อหา Classes and objects The $this keyword Chaining methods & properties Public vs. Private Magic methods Inheritance in PHP Abstract classes & methods Interfaces Polymorphism Type hinting Static methods & properties Namespace Trait มี 2 หัวข้อสุดท้ายที่ในลิ้งก์นั้นไม่มี แต่ผมเพิ่มเข้ามา เพราะว่ามันก็มีอยู่ใน OOP ของ PHP ทีนี้ก่อนอื่นเรามาดูกันก่อนซิว่า ทำไมโลกนี้มันถึงต้องมี OOP […]

    READ MORE