#เล่าสู่กันฟัง 63-023 object ใน moodle 1.9 (2008) กับ 3.8.1 (2020)

6 กุมภาพันธ์ 2563 ปลุก อภิธานศัพท์ (Glossary) ซึ่งเป็นโมดูลใน Moodle 1.9 (stable) บน Thaiall.com ที่ใช้ php 7.3 และ mysql 5.0 ได้สำเร็จ จึงเล่าสั้น ๆ ไว้ใน /blog ซึ่งปัญหาที่ใช้เวลางมงายอยู่พักหนึ่ง คือ script ของ Moodle 1.9 นั้น พัฒนาให้ใช้งานได้บน php5 แต่ใช้ไม่ได้บน php7 โดยเฉพาะพบการสร้าง class ชื่อ object ที่ extends คุณสมบัติของ stdclass มาใช้ พบในบรรทัดที่ 10 บนแฟ้ม lib/setuplib.php หากเปลี่ยนจาก object เป็น obj แต่ก็จะพบปัญหาใหม่อีกจำนวนมาก ที่มี code เรียกใช้คลาส object แต่ใน php 7.2 กำหนดให้ object เป็น reserved word ทำให้ทุกครั้งที่สั่ง new object จะ error เพราะ object ถือว่า deprecated ไปแล้ว ดังนั้น Moodle 1.9 จึงใช้งานบน php 7 ไม่ได้ หากไม่ได้รับการแก้ไขเรื่อง object

วิธีแก้ไข เรื่อง object คือ สั่ง replace ในแฟ้ม .php ทั้งหมด แทนที่คำว่า “= new object” เป็น “= new stdclass” แต่มีปัญหาเล็กน้อยที่ต้องระวัง คือ = new Object() มีการใช้งานใน javascript ซึ่งมีรูปแบบเหมือนกับที่ใช้ใน Moodle 1.9 แต่ไม่มีคลาสชื่อ stdclass ใน Javascript จึงสลับกันไม่ได้บน Javascript ดังนั้น การแทนที่ Object ด้วย stdclass ก็จะทำให้ Javascript ไม่สามารถทำงานได้ แต่การแทนที่ new object ด้วย new stdclass จะทำให้ทำงานได้ทั้งบน Moodle 1.9 และรุ่นที่สูงกว่า เช่น รุ่น 3.8.1 (ก.พ.2563)
อีก 2 ปัญหาที่พบใน mod/glossary คือ มีการใช้ eregi_replace ที่ต้องใช้ preg_replace แทน เนื่องจาก deprecated ไปแล้ว และพบหลายฟังก์ชันมีการประกาศให้รับตัวแปร จำนวนตัวแปรไม่ตรงกับตอนเรียกใช้ฟังก์ชัน ทำให้เกิด Internal Server Error ก็ต้องตามแก้ไขให้ตอนส่ง และตอนรับตรงกัน

เล่าเรื่องนี้ใน
http://www.thaiall.com/php/php7.htm