PHP เบื้องต้น > คำสั่งใช้ใหม่และฟังก์ชัน
คำสั่งใช้ใหม่
เป้าหมายหนึ่งของวิศวกรซอฟต์แวร์คือ การใช้คำสั่งใช้ใหม่ แทนที่การเขียนคำสั่งใหม่ เนื่องจากคำสั่งใช้ใหม่ ลดต้นทุน เพิ่มความน่าเชื่อถือ และปรับปรุงความตรงกันได้สะดวก ในทางทฤษฏี โครงงานใหม่ได้รับการสร้างขึ้นมาโดยการรวมส่วนชุดคำสั่งที่มีอยู่มาใช้ใหม่ และด้วยการพัฒนาน้อยที่สุด
การจัดกลุ่มคำสั่งเข้าสู่ไฟล์
ขั้นตอนแรกในการใช้คำสั่งใหม่คือ กำหนดปัจจัยในพิจารณาเลือกสิ่งที่ควรรวมและแยก มีข้อพิจารณา
จัดกลุ่มการทำงานร่วม
การเขียนโปรแกรมจะแบ่งการทำหน้าที่ออกเป็นฟังก์ชันให้ทำงานคนละหน้าที่ จากนั้นจึงรวมฟังก์ชันที่ทำงานสัมพันธ์กันให้อยู่ในไฟล์เดียวกันเพื่อความสะดวกในการค้นหา เช่น ฟังก์ชันแสดงส่วนหัวของเพจ ส่วนล่างของเพจ และเมนู สามารถรวมเข้าในไฟล์สำหรับการแสดงผลเพจ รวมทั้งไม่ต้องกลัวว่าในไฟล์มีฟังก์ชันไม่มาก
ทำให้การอินเตอร์เฟซแน่นอน
การเขียนคำสั่งกับการทำงานประเภทคล้ายกันควรเขียนคำสั่งแบบเดียวกัน เช่น การคำนวณเกี่ยวกับสี่เหลี่ยม
<?php
function rectangular_compute_area($side)
{
return $side['width'] * $side['length'];
}
function rectangular_modify_side(&$side, $diffwidth, $difflegth, $add=FALSE)
{
if ($add = TRUE)
{
$side['width'] += $diffwidth;
$side['length'] += $difflegth;
}
else
{
$side['width'] -= $diffwidth;
$side['length'] -= $difflegth;
}
}
?>
การเลือกชื่อไฟล์และตำแหน่ง
เมื่อจัดการแบ่งคำสั่งออกเป็นไฟล์ต่างหากแล้ว ต้องมีการเลือกชื่อและตำแหน่ง การตั้งชื่อไฟล์สคริปต์ไลบรารีนี้สามารถตั้งชื่อด้วยนามสกุล .php แต่อาจจะนำไปสู่ความเข้าใจผิดเล็กน้อย ประการแรกไม่สามารถสื่อถึงการใช้เป็นไลบรารีของคำสั่งสำหรับสคริปต์ PHP ประการต่อมาไม่มีสิ่งใดป้องกันบุคคลอื่นจากความพยายามที่เรียกใช้สคริปต์ใน browser
ดังนั้น ควรเลือกนามสกุล เช่น .inc หรือ .lib การใช้นามสกุล .inc ไม่มีข้อเสียเปรียบ เนื่องจาก browser ไม่ทราบว่าไฟล์นามสกุลนี้เป็นสคริปต์ PHP แต่ถ้าผู้ใช้เปิดดูจะคำสั่งภายในสคริปต์ตามภาพ 1.6.1
ภาพ 1.6.1 การเปิดดูไฟล์นามสกุล .inc บน browser
กลไกการป้องกันเข้าถึงไฟล์ไลบรารีเหล่านี้มี 2 แบบ กลไกแรกทำให้มั่นใจว่าไม่อนุญาตให้บุคคลทั่วไปเข้ามาดูและโหลดไฟล์ในไดเรคทอรีภายในโครงสร้างเอกสารเหล่านั้น กลไกที่ 2 ป้องกันโดยวางคำสั่งไลบรารีนอกโครงสร้างเอกสาร และอ้างอิงเชิงประจักษ์ไปยังไดเรคทอรีนั้นหรือบอกให้ PHP มองหา
ใน Microsoft Internet Information (IIS) มีโครสร้างเอกสารเป็น
C:\WebApplications\WWW
หรือใน Unix ( Linux, FreeBSD, Solaris และอื่นๆ) เรียกใช้ httpd ใน
/home/www
ไฟล์ไลบรารีสามารถใน
C:\WebApplications\Lib
หรือ
/home/lib
ไดเรคทอรีเหล่านี้ผู้ใช้ทั่วไปไม่สามารถเข้าถึงและไม่ต้องกังวลกับการดูไฟล์จากบุคคลอื่น
การรวมไฟล์ไลบรารีในสคริปต์ PHP มีวิธีการหลักในการรวมไฟล์ในสคริปต์
การใช้ require () และ include ()
PHP ให้ 2 วิธีอย่างง่าย เป็นประโยคคำสั่งที่ยอมใช้คำสั่งใหม่คือ ประโยคคำสั่ง require () หรือ include () ทำให้สามารถโหลดไฟล์เข้าสู่สคริปต์ PHP ไฟล์นั้นสามารถเก็บทุกอย่างที่พิมพ์อย่างปกติในสคริปต์ รวมถึงประโยคคำสั่ง PHP ข้อความ HTML tag ฟังก์ชัน PHP และ PHP class
ประโยคคำสั่งเหล่านี้ทำงานคล้ายกับ Server Side Include ที่มีให้โดยแม่ข่ายเว็บส่วนมากและประโยคคำสั่ง #include ใน C หรือ C++
การใช้ require ()
คำสั่งต่อไปนี้เก็บอยู่ในไฟล์ welcome.inc
<p align="center">
<?php
echo "<h1>Welcome to web development with PHP</h1>";
?>
</p>
คำสั่งต่อไปนี้เก็บอยู่ในไฟล์ main.php
<html>
<head>
<title>File Include Sample</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-11">
</head>
<body>
<?php
echo "<b> นี่เป็นหน้าหลัก </b><br/>";
require("welcome.inc");
echo "<b> จบสคริปต์ </b><br/>";
?>
</body>
</html>
ถ้าโหลด reuse.php แล้วจะไม่แปลกใจ เมื่อปรากฏ นี่คือประโยคคำสั่ง PHP อย่างง่าย บน browser ถ้าโหลด main.php
ไฟล์ต้องใช้ประโยคคำสั่ง require () ในตัวอย่างก่อนกำลังใช้ไฟล์ชื่อ welcome.inc จะเขียนดังนี้
require("welcome.inc");
PHP ไม่ได้มองนามสกุลไฟล์บนไฟล์ที่รวม หมายความว่า สามารถตั้งชื่อไฟล์ตามต้องการตราบเท่าที่ยังไม่ได้เรียก เมื่อใช้ require () โหลดไฟล์ จะมีผลเป็นส่วนหนึ่งของไฟล์ PHP และได้รับการประมวลผลด้วย
ตามปกติ ประโยคคำสั่ง PHP จะไม่ประมวลผลถ้าอยู่ในไฟล์ที่เรียก เช่น page.html โดย PHP จะเรียกเฉพาะการกระจายไฟล์ด้วยการกำหนดนามสกุลเช่น .php อย่างไรก็ตามถ้าโหลด page_html ผ่านประโยคคำสั่ง require () แล้ว PHP ภายในจะได้รับการประมวลผล ดังนั้นสามารถใช้นามสกุลตามต้องการสำหรับไฟล์ที่รวม แต่ความคิดที่ดีคือ พยายามเข้มงวดกับแบบแผน เช่น .inc ตามที่ได้กล่าวไปแล้ว
ภาพ 1.6.2 ผลลัพธ์การเรียกใช้สคริปต์ main.php ที่รวมไฟล์ welcome.inc
การ ใช้ include ()
ประโยคคำสั่ง require () และ include () คล้ายกันมาก แต่มีความแตกต่างสำคัญบางสิ่งตามการทำงาน
ประโยคคำสั่ง include () ได้รับการประเมินแต่ละครั้งเมื่อประโยคคำสั่งได้รับการประมวลผลและไม่มีการประเมิน ถ้าประโยคคำสั่งไม่มีการประมวลผล ประโยคคำสั่ง require () ได้รับการประมวลผลครั้งแรก เมื่อประโยคคำสั่งได้รับการกระจาย แต่กลุ่มคำสั่งที่มีประโยคคำสั่งที่เก็บอยู่จะได้รับการประมวลผล
<?php
include("welcome.inc");
?>
การระบุตำแหน่งไฟล์รวม
การอ้างอิงไฟล์ไลบรารีใน PHP สามารถกำหนดแบบสัมพัทธ์และแบบสัมบูรณ์
สำหรับ Unix
require("../../lib/db_fns.inc");
require("home/httpd/lib/output/heder.inc");
สำหรับ Windows
require("..\..\Libs\Database\connections.inc");
require("D:WebApps\Libs\MathFunctions\area.inc");
ถ้าไม่ได้ระบุพาร์ทเชิงประจักษ์ PHP จะมองหาในไดเรคทอรีปัจจุบัน ตามด้วยรายการไดเรคทอรีจากการตั้งค่า include_path ในไฟล์ php.ini ภายใต้ Unix ตัวอักษรแบ่งคือ colon (:) สำหรับ Windows ตัวอักษรแบ่งคือ semicolon (;)
ตัวอย่างการตั้งค่าภายใต้ระบบ Unix
include_path=".:/usr/local/lib/php:/home/httpd/globalincs"
ภายใต้ Windows การตั้งค่าคือ
include_path=".;C\PHP\include;D:\WebApps\Libs "
การรวมไฟล์และ Scope ของฟังก์ชัน
เมื่อมีการรวมไฟล์แล้ว การเรียกฟังก์ชันในไฟล์ที่รวมต้องอยู่หลังประโยคคำสั่ง include หรือ require ถ้าเรียกฟังก์ชันก่อนประโยคคำสั่งนี้จะเกิดความผิดพลาด
<?php
include("reverse_word.inc");
$strword = "Hello world";
word_reverse_r($strword);
echo "<br>";
?>
ปัญหาการใช้ไฟล์ร่วม
ในการใช้การรวมไฟล์ด้วยคำสั่ง require() และ include() ถ้าการอ้างอิงของสคริปต์ตั้งแต่ 2 ไฟล์ขึ้นไปอ้างถึงไฟล์ไลบรารีเดียวกัน การกระจายของ PHP จะทำซ้ำกัน จึงเกิดปัญหาที่ PHP เข้าใจว่ามีการประกาศฟังก์ชันซ้ำกัน
ตามตัวอย่าง compute_area.php รวมไฟล์ mathmetics.inc และ contruction.inc ซึ่งไฟล์คู่นี้รวมไฟล์ rectangular.inc
<?php
require("construction.inc");
require("mathmetics.inc");
?>
เมื่อเรียกใช้ compute_area.php จะปรากฎผลลัพธ์ความผิดพลาด
Fatal error : Cannot redeclare rectangular_compute_area() (previously declared in C:\AppServ\www\phptrain\chapter06\rectangular.inc:3) in C:\AppServ\www\phptrain\chapter06\rectangular.inc on line 6
การหลีกเลี่ยงปัญหานี้ให้ใช้ require_once() และ include_once()
require_once("mathmetics.inc");
include_once("mathmetics.inc");
การสร้างต้นแบบ
ถ้าเว็บไซต์มีเพจจำนวนมาก ในแต่ละหน้าจะมีส่วนหัวและส่วนล่างเหมือนกัน ในกรณีนี้สามารถใช้การรวมไฟล์เพื่อเรียกไฟล์ไลบรารีต้นแบบมาสร้างส่วนที่ใช้งานร่วมกัน
ตัวอย่าง เว็บต้อนรับของ widebase.net ประกอบด้วยส่วนหัว เนื้อความ และส่วนล่าง ส่วนหัวและส่วนล่างเหมือนกันในทุกเพจ ดังนั้น จึงสร้างไฟล์ html_hrader.inc สำหรับส่วนหัว และไฟล์ html_footer.inc สำหรับส่วนล่าง
ถ้าสร้างเพจใหม่สามารถรวมไฟล์ html_header.inc สำหรับส่วนหัว และไฟล์ html_footer.inc สำหรับส่วนล่างทำหน้าที่เป็นส่วนหัวและส่วนล่างของเพจ
|