บทความ OOP in PHP ตอนที่ 1 สำหรับลงใน ThaiAdmin Magazine เสร็จแล้ว เย้ …….

กว่าจะเขียนเสร็จเล่นเกือบตาย ไม่ใช่ว่ามันยากหรืออะไรหรอกครับ แต่ว่าการอธิบายให้ดูง่าย ๆ นี่มันทำยากกว่ามาก ๆ แถมการใช้ศัพท์ใด ๆ ต้องคิดถึงคนที่ไม่รู้ด้วยเป็นทุน ไม่งั้นมันจะส่งสารให้กับคนอ่านยากลำบากมาก โดยในบทความพยายามที่จะไม่ยัดศัพท์ทางเทคนิคใน OOP ลงไปแต่จะอาศัยการคำพูดไทย ๆ ที่เปรียบเทียบให้เห็นแล้ววงเล็บศัพท์เทคนิคตรงนั้นไป แล้วพยายามเอาเรื่องใกล้ ๆ ตัวมาอธิบายให้รูปแบบ OOP แทน ค่อย ๆ สอนเป็นขั้นเป็นตอน อะไรที่มันดูยาก ๆ อธิบายยาว ๆ ก็ตัดออกไปก่อนอย่าง Polymorphism นีไม่อธิบายเลย เอาหลัก ๆ 3 ส่วนพวก Abstract Data type, Encapsulation และ Inheritance ให้เห็นภาพก่อน แล้วค่อยเอาเรื่องยาก ๆ โดยมีการใช้ภาพประกอบอยู่หลายส่วน และนำเอาเรื่อง Object Model และ Reference Variable กับความสัมพันธ์ของ Object มาพูดด้วยโดยอาศัยหลักการ Object แท้ ๆ ในระดับล่างว่ามันทำงานอย่างไร เพื่อให้เห็นภาพว่าการที่เรา initialized แล้วมันเกิดอะไรขึ้นบ้าง แล้วไอ้ตัวแปรที่เป็น Object ตัวนั้นน่ะ จริง ๆ แล้วมันก็แค่ชื่อตัวแปร แต่ตัว Object จริง ๆ มันอยู่ในหน่วยความจำอีกทีหนึ่ง อะไรแบบนี้ เพราะไม่งั้นจะสับสนว่ามันก็แค่ตัวแปรตัวหนึ่ง แต่จริง ๆ แล้วมันมีอะไรมากกว่านั้น อ่อ ลืมไปว่าในนั้นก็ใส่เรื่องการส่ง Message ระหว่าง Object ลงไปในนั้นด้วย คงประมาณนี้ มีเขียน Hello World และให้ดูความแตกต่างว่าได้ Object มา 2 ตัวมันทำงานแตกต่างกันได้อย่างไร อะไรประมาณนี้ คงต้องอ่านในนิตยสารเอาหล่ะครับ ;) เพิ่งส่งให้ตอนเย็นนี้เอง แล้วเจอกันในนิตยสาร ThaiAdmin เล่ม 1 วันที่ 8 กุมพาพันธ์ 2550 นี้นะครับ ที่งาน Com world ครับ

บ่นนิดๆ สะกิดหน่อยๆ (Core Programming)

เมื่อ blog อันเมื่อกี้ไม่ได้ทักทายมาอันนี้ทักทายนิดดีกว่า

คือที่หายไปเพราะว่ามี project SAD แล้วเดี่ยวต้องทำ project Database ต่ออีก โอ้ววววววว ยังไม่พอนะท่านๆ ตอนนี้ทำ Project ขนาดใหญ่พอสมควร ทำคนเดียว อีก เวรกรรม เพราะว่าเพื่อนๆ ใน section และชั้นปีมันคงไม่มีใครเขียน PHP และทำงานบน MySQL ได้ (แค่ SQL ทำงานแบบ SELECT กว่า 80% ยังคงใช้งานไม่เก่งเพียงพอ ขื่นมาช่วยทำเกรงว่าเวลา train กับเวลาทำเอง จะพอๆ กันกลายเป็นงาน x2 ไป -_-”) แถมเขียน PHP แบบ OOP อีก ยิ่งไปใหญ่ เพราะอย่างที่บอกไป Concept OOP ถ้าคนไม่เข้าใจจะโคตร งง ผมก็ไม่ได้เก่งเท่าไหร่ แต่เอามาใช้งานได้ก็ถือว่า OK แหละ

คือเขียน PHP แบบ OOP นี่มันค้อนข้างจะผิดหลักพอสมควร (Version 4 ครับ) มันไม่ Encapsule เลย เซง แต่ก็พยายาม lock ตัวเอง และอื่นๆ ไม่ให้มันออกมานอก Class ได้แบบไม่ตั้งใจ ทุกๆ อย่างทำงานผ่าน Method หมด กันไว้ก่อน เพราะว่ามันปรับแต่งผ่าน Method ให้มันจัดการกับตัวแปรต่างๆ ได้ง่ายกว่าด้วย ขื่นให้ดึงไปใช้ได้ดื้อๆ มันจะมีปัญหาแน่นอน …. ตอนปรับแต่ง code บางคนที่มามอง class อาจดูโง่ๆ แต่ถือว่าเผื่ออนาคตดีกว่า มันไม่แน่ไม่นอน เพราะว่ายิ่งใกล้ทำ prototype ให้เค้ายิ่งมี request ที่ไม่ตรงกับ interfact และ operation ของเรามากขึ้น ยิ่งต้องเตรียมการไว้ก่อน จะได้สบายหน่อย

แต่ PHP แบบ OOP ถือว่าเขียนง่ายนะ สำหรับ Version 4 แต่ถ้า Version 5 ผมว่า OK กว่า แต่ว่าหา Server มา Run มันยากเลยต้องยึด เจ้า Version 4 ไปก่อนดีกว่า เพราะว่า Version 5 มันไปไกล และเขียนได้ดูเป็น OOP มาก และจัดการตัวแปร ง่ายกว่าเยอะ ทำให้ผมโปรแกรมภายในได้ง่ายกว่าเยอะเลย แต่ก็เล็กกับข้อกำหนดจุกจิกสักหน่อย แต่ไม่หวั่น เพราะว่าC++ มันมีเยอะกว่า เลยเฉยๆ ฮา …….

แต่เมื่อวานนี้คุยกับรุ่นน้องคนนึงมาคุยเรื่องเขียนโปรแกรมแบบ OOP ไม่รู้เรียนอีท่าไหน เอาตัวแปรมาใส่ Public เพียบเลย แถมถามกลับไปว่ารู้จักใช้ get/set ป่าว ตอบกลับมาแบบ งง ว่า “คือไร” ไอ้เราก็เซงเลยดิ อืมมมมม นะ

คือไม่ใช่อะไรหรอก การจัดการตัวแปร ต้องผ่าน method ที่ขึ้นต้นด้วย get (เข้าถึง) และ set (ตั้งค่า) ด้วยเหตุผลว่า การเข้าถึงแบบ method นั้น เราสามารถโปรแกรมได้ว่าจะ get/set แล้วมีขั้นตอนอย่างไรบ้าง โดยที่ข้อมูลที่ “ตั้งค่า” และ “เข้าถึง” นั้นจะถูกนำไปใช้งาน หรือได้รับออกมาได้ถูกต้องตรงตามที่มันควรจะเป็นไป เช่น(ตัวอย่าง PHP นะ)
$x->set_month(15); // มันจะไม่ได้ เพราะว่าใน method นี้จะมีการตรวจเช็คว่า value >0 and <13 อยู่ และ return หรือ echo ออกมาว่า เกินกว่าจำนวนเดือนที่เป็นจริง แต่ถ้าเป็น
$y->date_month = 15; // มันจะใส่ได้ และไม่ขึ้น error หรือ echo อะไร เพราะว่ามันเป็นการใส่ค่าไปตรงๆ โดยไม่มีการตรวจสอบแบบด้านบน

ส่วน get ก็ประมาณเดียวกัน แต่ว่าการ get อาจจะเอามาใช้ในการแปลงตัวแปรต่างๆ ได้เช่นกัน ประมาณว่า
echo($x->get_month_name(12)); // มันก็จะเอา 12 ไปเทียบกับ string แล้ว return ค่าเป็นชื่อเดือนแทน อะไรประมาณนี้

เห็นแมะ ถ้าจัดการผ่าน method มันจะทำให้เราเขียนจัดการตัวแปรเข้า และออกจาก object ได้ง่าย และถูกต้องตรงตามความจริงได้ง่ายๆ เลย

ใครคิดว่า OOP มันเป็นอะไรที่ยาก ลองศึกษาและคิดใหม่น่าจะดีนะ ;)