ตัวแปร2

ตัวแปรและการอ้างอิง
ชื่อตัวแปรในภาษา PHP จะมีลักษณะเช่นเดียวกันกับชื่อตัวแปรในภาษา Perl กล่าวคือตัวแปรทุกตัว จะขึ้นต้นด้วยเครื่องหมาย “$” เสมอ นอกจากนี้ตั้งแต่ PHP version 4 เป็นต้นมายังมีวิธีการ ในการอ้างอิงตัวแปรแบบ reference ได้อีกด้วย ทั้งนี้การอ้างอิงตัวแปรแบบ reference จะมีลักษณะเหมือนกับการอ้างอิงด้วย Pointer ในภาษา C คือข้อมูลจะถูกชี้ไปยังตำแหน่งเดียวกัน ในหน่วยความจำ โดยการอ้างอิงในลักษณะนี้จะใช้อ้างอิงถึงตัวแปรตำแหน่งเดียวกันด้วยชื่อมากกว่า 1 ชื่อ ดังตัวอย่างต่อไปนี้
<?php
$A = "Test";
$B = 10;
$C = 10.01;
$ptr = &$A;
echo ("A : $A\n"); // A : Test
echo ("B : $B\n"); // B : 10
echo ("C : $C\n"); // C : 10.01
echo ("ptr : $ptr\n"); // ptr : Test

$ptr="Hello, $ptr";
$C=$B;
$C=200;
echo ("ptr : $ptr\n"); // ptr : Hello, Test
echo ("B : $B\n"); // B : 10.01
echo ("C : $C\n"); // C : 200
echo ("A : $A\n"); // A : Hello, Test
?>
การอ้างอิงตัวแปรแบบ Reference
จากตัวอย่างจะพบว่า $ptr เป็นตัวแปรที่ reference ถึง $A โดยการกำหนด $ptr= &$A; ดังนั้นการเปลี่ยนแปลงใดๆ ก็ตามที่เกิดขึ้นกับตัวแปร $ptr ก็จะเกิดขึ้นกับตัวแปร $A เช่นกัน
ข้อควรระวัง : ชื่อตัวแปรใน PHP มีลักษณะเป็น Case Sensitive เช่นเดียวกันกับตัวแปรในภาษา C ดังนั้น $var, $Var, $vaR จะหมายถึงตัวแปรที่มีชื่อแตกต่างกัน 3 ตัว
ตัวแปรตัวแปร
ในบางกรณีเพื่ออำนวยความสะดวกอาจจะมีการอ้างอิงถึงตัวแปรตัวแปรก็ได้เช่นกัน เช่น กรณีต้องการอ้างอิงถึงตัวแปรชื่อ $test อาจทำได้โดยการอ้างอิงถึง$$a โดย $a มีความเป็น “test” ก็ได้ ดังตัวอย่างต่อไปนี้
<?php
$a= "test;
$$a="variable";
echo ("$a ${$a}"); // ทั้งสองบรรทัดจะได้ผลลัพธ์เหมือนกัน
echo ("$a $test"); //
?>
การอ้างอิงตัวแปรตัวแปร
การอ้างอิงตัวแปร $$a หรือ ${$a} ในตัวอย่างจะมีความหมายเหมือนกับการอ้างอิงด้วย $test โดยตรง ทั้งนี้กรณีที่ต้องการจะอ้างอิงใน expression นั้นให้ใช้ ${$a} เท่านั้น มิเช่นนั้น การตีความผลลัพธ์อาจจะผิดพลาดได้
นอกจากนี้หากต้องการอ้างอิง Array ด้วยตัวแปรตัวแปรนั้น ผู้ใช้จะต้องเขียนเพื่อแยกแยะความสับสน ของการประมวผลด้วย เช่น $$a[1] อาจจะมีความหมายได้ว่า ${$a[1]} หรือ ${$a}[1] ก็ได้ ดังตัวอย่างต่อไปนี้
<?php
$a="HELLO..";
$b[1]="Test";
$Test="5555";
$x="a";
echo ${$x}[1]; // จะได้ผลลัพธ์ เป็น "E" ซึ่งเป็นตัวอักษรที่ 2 ใน "A"
echo ${$b[1]}; // จะได้ผลลัพธ์ เป้น "5555" ซึ่งเป็นค่าของ $Test
?>
การอ้างอิง Array ด้วยตัวแปรตัวแปร
ตัวแปรจากระบบ
ตัวแปรจากระบบคือตัวแปรที่ถูกกำหนดขึ้นโดย Web Server และผ่านต่อมายัง PHP ซึ่งรายละเอียดจะแตกต่างกันไปใน Web Server แต่ละตัว ทั้งนี้เราอาจจะตรวจสอบได้ว่า Web Server ของเรานั้นมีการส่งค่าใดบ้างมาถึง PHP ได้โดยการเรียกใช้ Function phpinfo(); และดูในส่วนของ Web Server ของตน (กรณีเป็น Apache ก็ให้ดูในส่วน Apache กรณีเป็น IIS ก็ให้ดูในส่วน IIS เป็นต้น ) ดังได้แสดงให้ดูแล้ว ในหัวข้อทดสอบการทำงาน ของการติดตั้ง PHP ในที่นี้จะอธิบายตัวแปรต่างๆ กรณีที่ Web Server เป็น Apache ดังนี้ (รายละเอียดเพิ่มเติมสามารถหาอ่านได้จากคู่มือของ Web Server แต่ละระบบที่ท่านใช้อยู่)
Variable
Description
DOCUMENT_ROOTบอกค่าของ Directory ที่เป็น Root ของ Web Server
HTTP_ACCEPTMIME Type ที่ Browser ของ User สามารถรับได้ เช่น image/gif
HTTP_ACCEPT_ENCODINGมาตรฐานการเข้ารหัสที่ Browser ของ User สามารถรับได้เช่น gzip
HTTP_ACCEPT_LANGUAGEภาษาที่ Browser ของ User สามารถรับได้ เช่น th, iso8859-1
HTTP_CONNECTIONลักษณะ Connection เช่น Keep-Alive
HTTP_HOSTชื่อ Host
HTTP_USER_AGENTชื่อ Web Browser ของผู้ใช้ ทั้งนี้หากใช้งานร่วมกับ Function get_browser() และการตั้งค่า browscap.ini จะช่วยให้ทราบว่า Browser ดังกล่าว สามารถทำงานอะไรได้บ้าง
PATHเป็น PATH ของ ระบบ
REMOTE_ADDRIP ของเครื่อง USER
REMOTE_PORTPort ของเครื่อง USER
SCRIPT_FILENAMEpath ที่ไปยังไฟล์ Script ดังกล่าว (สัมพัทธ์กับ DOCUMENT_ROOT)
SERVER_ADDRIP ของเครื่อง SERVER
SERVER_ADMINe-mail ของผู้ดูแล Server
SERVER_NAMEชื่อของ SERVER
SERVER_PORTPORT ของ SERVER (ปกติคือ 80)
SERVER_SIGNATUREรายละเอียดของระบบ Web Server เช่น Apache/1.3.2 at www.host Port 80
SERVER_SOFTWAREชื่อซอฟต์แวร์ระบบ Web Server เช่น Apache/1.3.12 (Unix) PHP/4.0.1pl2
GATEWAY_INTERFACEมาตรฐาน CGI ของระบบ เช่น CGI/1.1
SERVER_PROTOCOLมาตรฐาน HTTP ของ SERVER เช่น HTTP/1.1
REQUEST_METHODวิธีการเรียกใช้ SCRIPT เช่น GET, POST, HEAD, PUT เป็นต้น
QUERY_STRINGเป็น QUERY_STRING ที่เรียกมายังหน้าดังกล่าว เช่น URI เป็น test.php?hello จะได้ว่า QUERY_STRING คือ hello
REQUEST_URIเป็น URI ที่ผู้ใช้เรียกมาถึงหน้าดังกล่าว
SCRIPT_NAMEชื่อของ file ที่ทำงาน SCRIPT ดังกล่าว
ตัวแปรระบบที่ได้รับจาก Web Server
นอกจากนี้ยังมีตัวแปรระบบ Environment ของระบบอีก ซึ่งจะแตกต่างกันออกไป ตามสภาวะของระบบแต่ละระบบทั้งนี้ผู้อ่านสามารถดูได้จาก Environment ของ ระบบปฏิบัติการที่ใช้ หรือ ดูจากผลลัพธ์ของ Function phpinfo(); ก็ได้
ตัวแปรจาก PHP
เป็นข้อมูลที่ตัวแปลภาษา PHP เตรียมให้ผู้ใช้ก่อนเริ่มทำการประมวลผลคำสั่งต่างๆ ทั้งนี้ตัวแปรบางตัว จะมีการกำหนดค่าเริ่มต้นโดยตัวแปลภาษา PHP หรือไม่นั้นขึ้นอยู่กับการตั้งค่าบางตัวใน PHP.INI ด้วย
Variable
Description
argvเป็น Array ของ argument ที่เรียกเข้าสู่ PHP ใน Command-line หรือกรณี GET Method จะแสดง QUERY_STING (ในลักษณะเดียวกันกับภาษา C)
argcแสดงจำนวนของ argument ที่เรียกเข้าสู่ PHP ใน Command-line
PHP_SELFแสดงชื่อ SCRIPT ที่กำลังทำการประมวลผล (ไม่สามารใช้ได้ในการเรียก PHP แบบ Command-line)
HTTP_COOKIE_VARSเป็น Array ของ ข้อมูลที่ใด้รับจาก Web Browser ผ่าน ระบบ cookie (Cookie เป็นข้อมูลเพียงชนิดเดียว ที่ผู้เขียน Web สามารถฝากไว้ที่ Web Browser ของผู้ใช้ได้)
HTTP_GET_VARSเป็น Array ของข้อมูลที่ได้รับผ่าน GET Method ของ Web
HTTP_POST_VARSเป็น Array ของข้อมูลที่ได้รับผ่าน POST Method ของ Web
ตัวแปรระบบที่ได้จาก PHP
ในกรณีของ PHP Version 4.0 นั้น ค่า argv และ argc และเกิดขี้นหรือไม่นั้น ผู้ใช้จะต้องตั้งค่า register_argc_argv=On ใน PHP ด้วย และการใช้ HTTP_*_VARS นั้น จะต้องตั้งค่าtracks_var=On ด้วย (รายละเอียดเพิ่มเติมให้ดูในหัวข้อตัวแปรจาก Web)
ข้อควรระวัง : ชื่อ Variable ที่แสดงดังกล่าวนั้น เมื่อต้องการจะอ้างอืงใน PHP จะต้องอ้างอิงด้วย $ นำหน้าเสมอ เช่น $REMOTE_ADDR เป็นต้น
ตัวแปรจาก Web
ตัวแปรที่ได้รับจากหน้า Web Page นั้นอาจจะได้รับมาจาก URL หรือ Form ผ่าน Get Method, Post Methid หรือ อาจจะมาจาก Cookie ก็ได้ ทั้งนี้ใน PHP จะเรียกตัวแปรที่ได้รับผ่าน Web ว่า GPC ซึ่งเป็นตัวย่อของ Get, Post และ Cookie ตามลำดับ ซึ่งโดยปกติ PHP ก็จะประมวลผล ในการตั้งค่าของข้อมูลตามลำดับเหล่านี้เช่นเดียวกัน ดังนั้นข้อมูลใน Cookie จะมีลำดับความสำคัญสูงสุด และข้อมูลใน Get Method จะมีความสำคัญต่ำสุด (สำหรับผู้ที่ไม่คุ้นเคยกับการทำงานของ Web นั้น Get Method คือการผ่าน Parameter ผ่าน URL เช่น http://www.test.com/test.php?test=5555 เป็นต้น) กรณีนี้ที่ผู้ใช้ต้องจะเปลี่ยนลำดับในการประมวลผลค่าตัวแปรจาก Web นั้น ผู้ใช้อาจจะตั้งค่าที่ gpc_order ใน PHP.INI ก็ได้
การอ้างอิงถึงตัวแปรที่ได้รับผ่าน Web สามารถกระทำได้ 2 วิธีคือการอ้างอิงผ่าน Global Variable หรือ การอ้างอิงผ่าน Array ชื่อ HTTP_*_VARS โดย * คือแหล่งกำเนิดของข้อมูลเช่น GET,POST,COOKIE,SERVER หรือ ENV เป็นต้น (ในกรณีของ PHP Version 4.0 เป็นต้นไปนั้น ผู้ใช้ต้องตั้งค่า register_globals=on ใน PHP.INI ก่อนจึงจะทำการอ้างอิงค่าผ่าน Global Variable ได้) ดังตัวอย่างของ Form ต่อไปนี้
<form method=post>
<input type=text name="myvar">
</form>
<?php
echo $myvar;
// or
echo $HTTP_POST_VARS["myvar"];
?>
จากตัวอย่างจะพบว่าข้อมูลในฟอร์มชื่อ myvar สามารถอ้างอิงได้ด้วย $myvar หรือ $HTTP_POST_VARS["myvar"] (กรณีเป็น post method) หรือ $HTTP_GET_VARS["myvar"] (กรณีเป็น get method) ทั้งนี้การอ้างอิงด้วย HTTP_*_VARS นั้น จะระบุถึงแหล่งกำเนิดข้อมูลที่ถูกต้องเสมอ ซึ่งช่วยลดความผิดพลาดในการประมวลผล และช่วยในแง่ของความปลอดภัยของระบบได้อีกทางหนึ่งด้วย อย่างไรก็ตาม ในบางกรณีก็ทำให้เกิดความยุ่งยากในการเขียนโปรแกรม เพราะในบางกรณี เราก็ต้องการโปรแกรมที่ทำงานได้ทั้ง Get และ Post Method เช่นกรณีของ Search Engine เป็นต้น ดังนั้นผู้ใช้อาจจะใช้งานทั้ง 2 ผสมกันก็ได้ โดยในส่วนที่ต้องการระบุถึงแหล่งกำเนิดของข้อมูลให้ทำการอ้างอิงผ่าน HTTP_*_VARS และกรณีที่ไม่ต้องการระบุ ก็ทำการอ้างอิงผ่าน Global Variable
การใช้ IMAGE SUBMIT
ในบางกรณีผู้เขียน Web อาจจะใช้ Image แทนการใช้ปุ่ม Submit ก็ได้ ซึ่งในกรณีนี้ PHP จะกำหนดตัวแปรเพิ่มขี้นอีก 2 ตัว คือ *_x และ *_y เพื่อใช้แสดงตำแหน่ง X และ Y ของปุ่มที่ถูกกด ดังตัวอย่างต่อไปนี้
<form method=post>
<input type=text name="myvar">
<input type=image src="img.gif" name="bot">
</form>
<?php
echo "($bot_x , $bot_y)";
?>
ผลลัพธ์ที่ได้จาก Script ดังกล่าวจะแสดงคู่ลำดับ (x,y) ที่ผู้ใช้กดที่รูปภาพ เป็นต้น
ข้อแนะนำในการตั้งชื่อตัวแปร
ในการตั้งชื่อตัวแปรนั้นผู้เขียนโปรแกรมควรจะตั้งชื่อตัวแปรโดยใช้ประโยชน์จากระบบ Array เพื่อป้องกันความสับสนของแหล่งกำเนิดข้อมูล เช่น กรณีที่ต้องการสร้างฟอร์ม อาจจะตั้งชื่อตัวแปรต่างๆในฟอร์มเป็น post[ชื่อตัวแปร] เป็นต้น ดังตัวอย่างต่อไปนี้
<form method=post>
<input type=text name="post[username]">
<input type=password name="post[password]">
</form>
<?php
echo "($post[username] , $post[password])";
?>
นอกจากนี้ยังมีข้อควรระวังในการตั้งชื่อคือ ชื่อที่ตั้งไม่สามารถใช้จุดได้ ดังนั้นควรหลีกเลี่ยงใช้ underscore หรือ “_“ แทน
ขอบเขตของตัวแปร
โดยปกตินั้นขอบเขตของตัวแปรใน PHP จะถูกจำกัดอยู่เพียง Block เดียวเท่านั้น อย่างไรก็ตาม Block นี้รวมถึงของเขตจากการ require และ include ด้วย (ดูรายละเอียดเพิ่มเติมของ require และ include ได้จากการสร้าง library และการแทรก php จาก File อื่นๆ) เช่น
<?php
$var = "Hello";
include ("test.inc");
?>
ตัวแปร var จะอยู่ในขอบเขตของ test.inc ด้วยเช่นกัน อย่างไรก็ตามขอบเขตของตัวแปร จะไม่เข้าไปสู่ฟังก์ชันย่อยอื่นๆ (ดูรายละเอียดการเขียน Function เพิ่มเติมในหัวข้อการสร้างฟังก์ชัน ) เช่น
<?php
$var = "Hello"; // Global Variable

MyFunction();

Function MyFunction()
{
     echo $var;
}
?>
จากตัวอย่าง $var ซึ่งเป็น Global Variable จะไม่อยู่ในขอบเขตของ $var ภายใน Function MyFunction ด้วยเหตนี้ ผลลัพธ์ที่ได้จากการทำงานโปรแกรมดังกล่าวจึงไม่มีข้อมูลใดๆ แสดงผลออกมา ดังนั้นในกรณีที่ผู้เขียนต้องการจะอ้างอิงตัวแปร Global Variable ในฟังก์ช้นนั้นสามารถกระทำได้ 2 วิธีคือ การอ้างอิงผ่าน Array ชื่อ $GLOBALS หรือ การประกาศในฟังก็ชันให้ตัวแปรเป็นแบบ Global ก่อนทำการใช้งาน ดังตัวอย่างข้างล่าง MyFunction และ MyFunction1 จะให้ผลลัพธ์ที่เหมือนกันคือ แสดงค่า “Hello”
<?php
$var = "Hello"; // Global Variable

MyFunction();
MyFunction1();

Function MyFunction()
{
     gloabl $var;
     echo $var;
}

Function MyFunction1()
{
     echo $GLOBALS("var");
}

?>
อย่างไรก็ตามในบางกรณีผู้เขียนอาจมิได้ต้องการให้ตัวแปรที่อ้างอิงเป็น GLOBAL เสมอไป หากแต่ต้องการให้อยู่ภายในขอบเขตที่กำหนดและจำค่าไว้ (ในทำนองเดียวกันกับตัวแปร static ในภาษาชั้นสูงอื่นๆ) ดังอาจจะพิจารณาได้จากฟังก์ชัน X และ Y ในตัวอย่างต่อไปนี้
<?php
X(); // การเรียก Function X จะแสดงค่า 5 เสมอ
X(); //
Y(); // แสดงค่า 5
Y(); // แสดงค่า 6
Function X()
{
$var = 5;
echo $var;
$var++;
}
Function Y()
{
static $var = 5;
echo $var;
$var++;
}

?>
ในฟังก็ชัน X จะไม่มีการจำค่าตัวแปร $var ไว้ ดังนั้นการเรียกฟังก์ชัน X แต่ละครั้งตัวแปร $var จึงถูกกำหนดให้เริ่มต้นเป็น 5 ทุกครั้ง ในขณะที่การกำหนดตัวแปร $var ในฟังชัน Y จะเป็นแบบ static จึงมีการจำค่าไว้ตลอดเวลา และจะถูกกำหนดใหม่เฉพาะกรณีที่ตัวแปร $var ไม่เคยถูกกำหนดมาก่อนเท่านั้น