Post archive

Category: PHP

  • PHP

    PHP Error: The Encrypt library requires the Mcrypt extension

    ใน PHP บางเวอร์ชั่นที่ดาวน์โหลดมาเขาก็ไม่ได้เปิด extension บางตัวไว้ หรือบางทีก็ไม่แนบมาให้ด้วย เรามาดูวิธีจัดการกับเออเร่อกรณีไม่มี extension ที่ต้องการ

    READ MORE
  • PHP

    การลบข้อมูลหลายแถวออกจากดาต้าเบส ด้วย checkbox

    บทความนี้เขียนขึ้นมาเพื่อบูชาตัวเอง ที่ได้เคยเขียนบทความเรื่องนี้มาแล้วครั้งหนึ่งและบทความนั้นเสียหายไป

    เลยเขียนขึ้นมาใหม่

    READ MORE
  • PHP

    Warning: include(C:/xampp/htdocs/inc/config.php): failed to open stream: No such file or directory in C:\xampp\htdocs\dbsocial\index.php on line 2

    พาธผิดแค่นั้น

    READ MORE
  • PHP

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

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

    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