#เล่าสู่กันฟัง 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

หลีกเลี่ยงการตรวจค่า null ตอนที่ 1 (แต่ตัวอย่างที่ยกมานี้ยังไม่หลีกเลี่ยงการตรวจสอบ)

person object
person object

เคยอ่าน blog ของ Somkiat Puisungnoen
เจ้าของโดเมน somkiat.cc ซึ่งคุณตุ้ยแนะนำมา
ชื่อโพสต์ “Java :: หลีกเลี่ยงการตรวจสอบค่า Null กันได้แล้ว
โดยมี code ตอนหนึ่งว่า
1. PersonDAO personDAO = new PersonDAO();
2. Person person = personDAO.getPersonByID(1);
3. if(person != null) {
4. person.setName(“My name”);
5. }

ซึ่งแนะนำการหลีกเลี่ยงการใช้ null ไว้ 2 วิธี
http://www.somkiat.cc/java-avoid-check-null-in-your-code/

1. บรรทัดแรก
สร้าง instace ชื่อ personDAO จากคลาส PersonDAO
คำว่า DAO มาจาก Data Access Object ทำหน้าที่เข้าถึงข้อมูล
ทำให้มี instace ไว้ใช้งานด้านข้อมูล และติดต่อกับฐานข้อมูล
2. บรรทัดที่สอง
สร้าง instace ชื่อ person จากคลาส Person
ซึ่งมีค่าต่าง ๆ ตามที่กำหนด หรือการประมวลผลที่สำคัญกับข้อมูล
3. บรรทัดที่สาม
ตรวจสอบว่ามี person หรือไม่
ถ้าเรียกใช้ทั้ง ๆ ที่เป็น null ก็จะ error
4. บรรทัดที่สี่
ถ้ามีก็จะกำหนดค่าให้กับ object ใน person
ตามหลัก set กับ get

นำแนวคิดของคุณสมเกียรติ มาทำให้โปรแกรมประมวลผลได้
โดยยังไม่หลีกเลี่ยงการตรวจค่า null แต่ใช้ if != null เหมือนตัวอย่างไปก่อน
1. คลาส PersonDAO ทำหน้าที่เข้าถึงฐานข้อมูลในเบื้องต้น
การ return ต้องกำหนดค่าอะไรสักอย่าง จึงต้องกำหนดเป็น null ไว้แต่แรก
ถ้าไม่กำหนดก็จะ compile ไม่ผ่าน เช่น Person person;
public class PersonDAO {
public Person getPersonByID(int personID) {
Person person = null;
if (personID < 10 && personID > 0) {
person = new Person();
person.setID(personID);
}
return person;
}
}

2. คลาส Person ทำหน้าที่โดยตรงในการเพิ่ม ลบ แก้ไขข้อมูล
public class Person {
private int id;
private String name;
public void setName(String s) { name = s; }
public void setID(int i) { id = i; }
public int getID() { return id; }
public String getName() { return name; }
}

3. คลาส Work ทำหน้าที่รับส่งข้อมูล ควบคุม และนำเสนอข้อมูล
public class Work {
public static void main(String args[]){
PersonDAO personDAO = new PersonDAO();
Person person1 = personDAO.getPersonByID(1);
if(person1 != null) {
person1.setName(“burin”);
System.out.println(person1.getID());
System.out.println(person1.getName());
}
Person person2 = personDAO.getPersonByID(11);
if(person2 != null) {
person2.setName(“tui”);
System.out.println(person2.getID());
System.out.println(person2.getName());
}
}
}
http://www.thaiall.com/class/

ตอนที่ 2 การใช้ try catch จับ Exception
http://www.thaiall.com/blog/burin/6560/