ผ่าพิสุจน์ GCMS4 ตอน 1 เริ่มต้นที่ index.php

แผนกนิติเวชขอเชิญทุกท่านร่วมผ่าพิสูจน์ GCMS4 และขอยืนยันว่าทุกท่านที่ได้อ่านบทความนี้จะไม่ผิดหวังแน่นอน

แผนกนิติเวชจะพาทุกท่านได้ชมการผ่าพิสูจน์ในแต่ละไฟล์โดยละเอียดชนิดว่า บรรทัดต่อบรรทัด คำสั่งต่อคำสั่ง

ทุกขั้นตอนการทำงานของระบบ แต่เราจะอธิบายในรูปแบบที่เรียกว่าเป็นการคุยกันแบบสะบายๆ ไม่ซีเครียด

แต่หากใครที่ขี้เกียจอ่านทั้งหมดหรือมีพื้นฐานอยู่บ้างแล้ว ก็ข้ามไปอ่านตรงสรุปได้เลย จะได้ไม่เสียเวลา

ซึ่งในตอนแรกของบทความนี้จะกล่าวถึงส่วนในส่วนที่ขาดไม่ได้เลย เพราะมันเป็นส่วนที่ถูกเรียกใช้เป็นอันดับแรก

เมื่อคุณเข้าชมเว็บไม่ว่าเว็บไหนๆ ก็ต้องมีไฟล์นี้

ซึ่งที่เราจะกล่าวถึงเป็นอันดับแรกเลยคงจะเป็นไฟล์ไหนไปไม่ได้นอกจากไฟล์ index.php

ก่อนที่จะผ่าเราลองมาดูโค้ดเต็มๆ กันก่อน
<?php require_once (dirname(__FILE__).'/bin/inint.php');
DEFINE('MAIN_INIT', ROOT_PATH);
if (is_file(ROOT_PATH.'bin/config.php')) {
   require_once (ROOT_PATH.'bin/config.php');
}
if (empty($config['skin']) || empty($config['db_username']) || empty($config['db_name'])) {
   require_once ('admin/install.php');
} else {
   require_once ('load.php');
}

อย่างที่เห็นกันในไฟล์นี้มีโค้ดเพียงแค่ไม่กีบรรทัด แต่เป็นไฟล์ที่สำคัญที่สุดเพราะเป็นจุดที่เชื่อมโยงทุกส่วนเข้าไว้

ด้วยกันเพื่อให้ทำงานได้อย่างเป็นระบบ

ในไฟล์นี้จะแบ่งการทำงานเป็นสองส่วนคือ

- การเตรียมความพร้อมของระบบ

- การตัดสินใจเลือกให้ติดตั้งระบบใหม่หรือโหลดหน้าเว็บที่ถูกติดตั้งไว้แล้ว

เอาล่ะ ดูนาฬิกาตอนนี้มันควรจะได้เวลาผ่ากันแล้วล่ะ อย่าช้าอยู่เลย ลงมือกันได้แล้ว

เราจะมาดูกันที่ส่วนแรกก่อน เริ่มกันที่บรรทัดแรกเป็นการประกาศเริ่มต้นไฟล์เอกสาร PHP ซึ่งจะถูกเปิดโดยแท็กซ์

<?php เป็นไปตามข้อกำหนดในการประกาศเริ่มต้นการเขียน PHP

ในบรรทัดที่ 2

เราจะเห็นคำสั่งนี้
require_once (dirname(__FILE__).'/bin/inint.php');

เป็นการเรียกไฟล์ภายนอกเข้ามาทำงาน โดยที่ require_once นั้นจะเรียกไฟล์มาแค่ครั้งเดียวเท่านั้น

ลองดูภาพในวงเล็บของ require_once เราจะเห็นเส้นทางที่ตั้งของไฟล์ที่ถูกเรียกมาทำงานร่วมกัน

บางคนอาจจะยังไม่เข้าใจในวงเล็บดังกล่าว ตรงนี้จะอธิบายลงลึกไปอีกนิดส่วนใครที่เข้าใจดีอยู่แล้วก็ข้ามไปเลย

โดยภายในวงเล็บนั้นจะมีส่วนประกอบอยู่ด้วยกัน 2 ส่วน คือ
dirname(__FILE__)

และ
'/bin/inint.php'

ทั้ง 2 นั้นจะถูกเชื่อมกันด้วย . (จุด/ดอท)

ในส่วนท้ายคงพอจะเข้าใจได้ไม่ยากเพราะเป็นการอ้างไปถึงเส้นทางของที่อยู่ไฟล์โดยชัดเจน แต่ในส่วนต้น

(ส่วนแรก) นั้นหากไม่กล่าวถึงอาจจะงงหาที่มาที่ไปไม่ถูก dirname() นั้นเป็นฟังก์ชั่นสำเร็จรูปที่ PHP ได้

อำนวยความสะดวกให้เรายิบมาใช้งานได้ทันทีโดยไม่ต้องเขียนขึ้นมาเอง เออว่าแต่ว่ามันเอาไว้ใช้ทำอะไรล่ะ

นั่นน่ะสิเออมันเอาไว้ใช่ทำอะไรนะ

หน้าที่ของฟังก์ชั่น dirname() คืองมหาที่อยู่ที่เป็นโฟลเดอร์ของไฟล์ที่ภายในวงเล็บ อย่างเช่นถ้าเราใช้คำสั่ง

dirname('โฟลเดอร์A/file.php') เราก็จะได้ลัพภ์เท่ากับ 'โฟลเดอร์A' (อืม..ยั่งงี้นี่เอง)

เอ...

ฟังก์ชั่น dirname() มันจะงมหาที่อยู่ที่เป็นโฟลเดอร์ของไฟล์ที่ภายในวงเล็บใช่มั๊ย แล้วภายในวงเล็บเนี่ยมัน

เขียนออกมาอยู่ในรูปแบบ dirname(__FILE__) แล้วมันหมายความว่าไงกันล่ะ ไอ้เจ้า __FILE__ มันคือ

อะไรมีที่มายังไง

__FILE__ เป็นตัวแปรชนิดนึงที่ PHP เตรียมไว้ให้เราใช้ โดยเจ้าตัวถูกมันได้ถูกกำหนดไว้ล่วงหน้าแล้วว่าตัว

มันจะใช้สำหรับอ้างอิงไฟล์ที่เรียกทำงานอยู่ในปัจจุบัน (เหมือนกับการเรียกชื่อตัวเอง) เมื่ออยู่ภาพในวงเล็บ

ของ dirname() ก็จะเป็นการงมหาโฟล์เดอร์ปัจจุบันของไฟล์ index.php นั่นเอง ผลลัพภ์จะได้ออกมาเป็น

อะไรนั้นก็ขึ้นอยู่กับว่าคุณนำไฟล์ไปติดตั้งอยู่ที่ใด ในที่นี้ขอสมมุติว่าเป็น 'webroot'

เมื่อได้โฟลเดอร์ปัจจุบัน 'webroot'

นำมาต่อกับส่วนท้ายที่เราเห็นในตอนแรกคือ '/bin/inint.php'

ก็จะกลายเป็น 'webroot/bin/inint.php'

ทีนี้เราก็สามารถเรียกไฟล์ที่อยู่ webroot/bin/inint.php มาทำงานร่วมกันกับไฟล์ index.php ได้แล้ว

ว่ากันต่อกับโค้ดบรรทัดที่ 3

ในบรรทัดนี้จะเป็นการประกาศตัวแปรชนิดคงที่ไว้เพื่อรองรับการอ้างอิงของระบบ ตัวแปรชนิดนี้เป็นตัวแปรชนิด

เดียวกับตัวแปร __FILE__ ที่ผ่านมาเมื่อครู่ ว่าแล้วเราก็มาเริ่มผ่าบรรทัดนี้กัน
DEFINE('MAIN_INIT', ROOT_PATH);

สิ่งที่เราเห็นในบรรทัดนี้มีอยู่ด้วยกัน 2 ส่วนคือ

- ฟังก์ชั่น DEFINE()

- อาร์กิวเม้นท์ 2 ตัวที่อยู่ในวงเล็บ (ค่าที่เราส่งให้ฟังก์ชั่นเราไปทำงาน)

ส่วนแรกฟังก์ชั่น DEFINE() นี้เราจะใช้เพื่อประกาศตัวแปรเพื่อให้ PHP รู้จักกับตัวแปรคงที่ ที่อยู่ภายในวงเล็บ

เมื่อเราได้ประกาศตัวแปรคงที่นี้แล้วเราสามารถที่จะนำเอาชื่อตัวแปรที่เราได้ประกาศไว้ไปใช้ในส่วนใดก็ได้

ภายระบบของเราแต่ต้องอยู่หลังจากบรรทัดที่ได้ประกาศตัวแปรนี้ไว้

ส่วนที่สองอาร์กิวเม้นท์ 2 ตัวที่อยู่ในวงเล็บนั้นอะไรเป็นอะไรเรามาแยกแยะกันดู

ตัวแรก
'MAIN_INIT'

ตัวที่สอง
ROOT_PATH

มีจุดสังเกตที่เราจะรู้ว่ามันเป็นคนละตัวกันได้อย่างไร อันนี้ง่ายๆ อาร์กิวเม้นท์แต่ละตัวจะถูกแยกแยะโดยเครื่อง

หมาย , (ลูกน้ำ/คอมม่า) ตัวแรกเป็นการกำหนดชื่อให้กับตัวแปรตงที่ ในที่นี้ให้ชื่อว่า MAIN_INIT

ส่วนตัวที่สองนั้นจะเป็นการกำหนดค่าที่จะเก็บไว้ในตัวแปรที่ได้ประกาศขึ้น ซึ่งกำหนดไว้เป็น ROOT_PATH นั่นเอง

จากที่สืบประวัติมา ROOT_PATH ได้ถือกำเนิดเป็นตัวแปรคงที่ ณ บรรทัดที่ 17 ของไฟล์ bin/vars.php

แล้วนำมันมาใช้ที่นี่ได้อย่างไร ยังไม่เห็นในบรรทัดไหนที่อ้างอิงไปที่ bin/vars.php เลย ก็จริงอยู่ในไฟล์นี้

ไม่ได้มีส่วนไหนเอ่ยอ้างไปยังตำแหน่งดังกล่าว แต่ลองย้อนกลับไปดูโค้ดในบรรทัดที่ 2 ได้มีการเรียกไฟล์ขึ้นมาร่วม

ทำงานด้วยนั่นตือ webroot/bin/inint.php แล้วไฟล์ตัวนี้เองในบรรทัดที่ 11 ได้เรียกไฟล์ bin/vars.php

ต่ออีกทอดนึง

ถัดไปจะขออธิบายรวบยอดในบรรทัดที่ 4-5 และ 6 ไปทีเดียว เพราะเป็นชุดคำสั่งเดียวกัน ในบล็อคนี้จะเป็นการ

ตรวจสอบเงื่อนไขบางอย่างว่าตรงตามความต้องการหรือไม่ โดยใน่สวนนี้จะทำการตรวจสอบว่ามีไฟล์

webroot/bin/config.php อยู่ในระบบหรือไม่ ซึ่งมีคำสั่งที่ช่วยค้นหาดูว่าตามเส้นทางที่อยู่ดังกล่าวมีไฟล์นั้นอยู่จริง
หรือไม่นั่นคือฟังก์ชั่น is_file() การทำงานก็จะคล้ายๆกันกับฟังก์ชั่น dirname() แตกต่างกันเพียงแค่ dirname()
นั้นจะหาโฟลเดอร์ ส่วน is_file() นั่นจะหาไฟล์

หลังจากที่ได้ทำการตรวจสอบแล้วหากพบว่ามีไฟล์ webroot/bin/config.php นี้อยู่จริงก็จะเรียกไฟล์เข้ามา

ร่วมทำงานกับไฟล์ index.php นี้ด้วย เพื่อกำหนดค่าต่างๆ ของระบบโดยสมบูรณ์

หลังจากตรงนี้จะเป็นส่วนสุดท้ายแล้ว ใครจะลุกไปเข้าห้องน้ำก่อนก็ไม่ว่ากันแต่รีบหน่อยนะ ส่วนใครที่ไม่ลุกไปไหน

ก็แนะนำให้พักสายยตาสักแป๊บนึงหันออกไปมองนอกจอบ้างเผื่อเจอเนื้อคู่

อ่านมาถึงบรรทัดนี้แสดงว่าพร้อมแล้วเรามาเริ่มกันเลย และในส่วนสุดท้ายของไฟล์นี้จะขออธิบายรวบยอดเป็นบล็อค

เหมือนส่วนที่พึ่งจะอธิบายผ่านมา โดยจะตั้งแต่บรรทัดที่ 7-11
if (empty($config['skin']) || empty($config['db_username']) || empty($config['db_name'])) {
  require_once ('admin/install.php');
} else {
  require_once ('load.php');
}

โค้ดในบล็อคนี้จะเป็นการตรวจสอบว่าตัวแปร
$config['skin']
$config['db_username']
$config['db_name']

ว่างเปล่าอยู่หรือไม่ หากมีตัวใดตัวนึงเป็นค่าว่างเปล่า จะเรียกไฟล์ ติดตั้งระบบเข้ามาทำงานต่อ

ตัวแปรเหล่านี้ได้ถูกประกาศและกำหนดค่าไว้ในไฟล์ webroot/bin/config.php เป็นค่าที่ได้เมื่อเราทำการ

ติดตั้งระบบในคั้งแรก
require_once ('admin/install.php');

แต่หากตรวจสอบแล้วพบว่าต่าตัวแปรดังกล่าวไม่ค่าที่ถูกต้องตามที่ระบบกำหนดก็จะเรียกไฟล์โหลดเข้ามาทำงาน
require_once ('load.php');


สรุปการทำงานอธิบายตามบรรทัด

ไฟล์นี้เปรียบเหมือนการเตรียมความพร้อมในการเริ่มการทำงานของระบบ

1    เริ่มต้น PHP
2    นำเข้าไฟล์ webroot/bin/inint.php มาร่วมทำงานเพื่อเปิดใช้งานการบีบอัดเว็บและโหลดตัวแปรที่จำเป็น
      พื้นฐานของระบบ
3    ประกาศตัวแปรชนิดคงที่โดยให้ชื่อว่า MAIN_INIT ไว้รองรับการทำงานของระบบ
4    if ตรวจสอบว่ามีไฟล์ webroot/bin/config.php อยู่ในโฟลเดอร์ที่รับบติดตั้งไว้หรือไม่
5    ถ้ามีจะนำเข้าไฟล์ webroot/bin/config.php มาร่วมทำงานเพื่อกำหนดตัวแปรสำคัญของระบบ
6    ปีกกาปิด if ของบรรทัดที่ 4
7    if ตรวจสอบค่าของตัวแปร $config['skin'], $config['db_username'], $config['db_name']
8    หาก if ตรวจสอบแล้วเป็นค่าว่างเปล่าจะนำเข้าไฟล์ admin/install.php มาร่วมทำงานเพื่อติดตั้งระบบ
9    หาก if ตรวจสอบแล้วผลเป็นเท็จให้ปฏิบัติตามโค้ดในบรรทัดถัดไป
10  จากบรรทัดที่ 9 หาก if ตรวจสอบแล้วว่าตัวแปรดังกล่าวมีค่าถูกต้องจะนำเข้าไฟล์ load.php
      มาร่วมทำงานเพื่อเริ่มการทำงานของระบบ


 หมายเหตุ  หากลองสังเกตดูในทุกๆ ไฟล์นั้นมีการเปิดแท็กเริ่มของ PHP (<?php) แต่ไม่มีแท็กปิด (?>)
              จากที่ได้สอบถามกับคุณอา gOragod ได้ความว่า เป็นการป้องกันไวท์สเปคหรือค่าสตริงที่เป็นช่องว่าง
              (กด spacbar หนึ่งทีจะเข้าใจ) ที่อยู่หลังแท็ก ?> ติดมาด้วย

________________________________________________________________________________

==============================================================

บทความนี้เป็นปฐมบทจึงค่อนข้างที่จะอธิบายยืดยาวมากไปหน่อย สำหรับคราวหน้าจะขออธิบายในลักษณะของการ

สรุปเพื่อความกระชับของข้อมูลแต่ยังเน้นในการทำความเข้าใจที่ง่าย
^