การเขียนโปรแกรมภาษา PHP

            
               

Out Put
ข้อความใหญ่ขึ้น และจะหยุดทำงานเมื่อ a=5
ข้อความใหญ่ขึ้น และจะหยุดทำงานเมื่อ a=5
ข้อความใหญ่ขึ้น และจะหยุดทำงานเมื่อ a=5
ข้อความใหญ่ขึ้น และจะหยุดทำงานเมื่อ a=5
ข้อความใหญ่ขึ้น และจะหยุดทำงานเมื่อ a=5

Sample4.php
<?
$a=array("Somchai","Werachai ","Surachai","Adisorn");
$i=0;
while($i<=3)
{
echo"name : $a[$i] <br>";
$i++;
}
?>
Out Put
name : Somchai
name : Werachai
name : Surachai
name : Adisorn
 

 

 

Do..While
ทำก่อนแล้วค่อยพิจารณาเงื่อนไข ถ้าเงื่อนไขเป็นเท็จ จะกระโดดออกจากลูปทันที
Sample5.php
<?
$a=1;
do
{
echo"<font size=$a> ข้อความใหญ่ขึ้น และจะหยุดทำงานเมื่อ a=5 <br> ";
$a++;
}while($a<=5)
?>
Out Put
ข้อความใหญ่ขึ้น และจะหยุดทำงานเมื่อ a=5
ข้อความใหญ่ขึ้น และจะหยุดทำงานเมื่อ a=5
ข้อความใหญ่ขึ้น และจะหยุดทำงานเมื่อ a=5
ข้อความใหญ่ขึ้น และจะหยุดทำงานเมื่อ a=5
ข้อความใหญ่ขึ้น และจะหยุดทำงานเมื่อ a=5
Sample6.php
<?
$a=array("Somchai","Werachai ","Surachai","Adisorn");
$i=0;
do
{
echo"name : $a[$i] <br>";
$i++;
}while($i<=3)
?>
Out Put
name : Somchai
name : Werachai
name : Surachai
name : Adisorn


ตัวอย่างการใช้ while-do loop เพื่อคำนวณค่า เลขยกกำลังสอง ซึ่งมีเลขฐานตั้งแต่ 1 ถึง 10

<?
$x = 1;
while ($x <= 10) {
echo $x*$x,"\n";
$x++;
}
?>

เริ่มต้นด้วยการกำหนดตัวแปร $x ให้มีค่าเป็นหนึ่ง ซึ่งในกรณีนี้ เราใช้เป็นเลขฐาน ในการคำนวณเลขยกกำลังสอง เมื่อเข้าสู่การวนลูปแบบ while-do จะมีการตรวจดูเงื่อนไข ของการวนลูปในแต่ละครั้งว่า เงื่อนไขเป็นจริงอยู่หรือไม่ ในกรณีนี้ เรากำหนดเงื่อนไขในการวนลูปไว้ว่า ถ้าค่าของ $x มีค่าน้อยกว่าหรือเท่ากับ 10 ก็ให้ทำคำสั่งที่อยู่ภายในลูป ซึ่งก็คือ echo $x*$x,"\n"; โดยจะพิมพ์ค่าของผลคูณซึ่งหมายถึงเลขยกกำลังสองนั่นเอง หลังจากนั้น ก็ให้เพิ่มค่าของ $x ทีละหนึ่งในการวนลูปแต่ละครั้ง ค่าของ $x จะเพิ่มขึ้นเรื่อยๆจนมีค่ามากกว่า 10 เมื่อถึงเวลานั้น ก็จะเป็นการจบการวนลูป เพราะว่า เราจะได้ว่า เงื่อนไข ($x <= 10) มีค่าเป็นเท็จ
สมมุติว่า ถ้าเปลี่ยนจาก $x++ เป็น $x-- ปัญหาก็จะเกิดตามมาเวลาใช้งาน คือ แทนที่จะวนลูปแค่สิบครั้ง ก็กลับกลายเป็นว่า เป็นการวนลูปนับครั้งไม่ถ้วน เพราะว่า ค่าของ $x จะลดลงเรื่อยๆในการวนลูปแต่ละครั้ง คือเป็นลบ และค่าเป็นลบจะน้อยกว่า 10 เสมอ (ยกเว้นแต่ว่า เมื่อถึงจุดเวลาหนึ่งค่าเป็นลบมากๆ จะกระโดดกลับเป็นบวก)
ตัวอย่างการใช้ do-while loop เพื่อคำนวณค่าเลขยกกำลังสอง ซึ่งมีเลขฐานตั้งแต่ 1 ถึง 10

<?
$x = 1;
do {
echo $x*$x,"<BR>\n";
$x++;
} while ($x < 10);
?>
โปรดสังเกตความแตกต่างระหว่างการใช้ while-do และ do-while โดยเฉพาะตรงเงื่อนไข ในการจบการวนลูป ในกรณีของ do-while เราจะกระทำขั้นตอนในลูปก่อนหนึ่งครั้ง แล้วค่อยตรวจดูว่า เงื่อนไขในการวนลูปเป็นจริงหรือไม่ ความแตกต่างนี้ เราสามารถจำได้ง่ายๆ คือว่า ถ้าใช้ do-while จะต้องมีการทำคำสั่ง ภายในลูปหนึ่งครั้งเสมอ แม้ว่าเงื่อนไขโดยเริ่มต้นจะเป็นเท็จก็ตาม ซึ่งแตกต่างจาก while-do ถ้าเงื่อนไขเป็นเท็จตั้งแต่เริ่ม ก็จะไม่มีการทำคำสั่งที่อยู่ในลูป
อีกแบบหนึ่งสำหรับการวนลูปคือใช้ for-loop ทำได้ตามตัวอย่างต่อไปนี้

<?
for ($x = 1; $x <=10; $x++) {
echo $x*$x,"<BR>\n";
}
?>
ในบรรทัดที่เริ่มต้นด้วย for ระหว่างวงเล็บเปิดและปิด จะถูกแบ่งเป็นสามส่วนโดยเครื่องหมาย semicolon (;) ในส่วนแรกเราสามารถใส่คำสั่งที่ต้องการจะกระทำก่อนเข้าลูป ส่วนแรกนี้จะมีหรือไม่มีก็ได้ ในส่วนที่สองจะเป็นเงื่อนไขสำหรับการทำ loop และในส่วนที่สามจะคำสั่งที่จะต้องทำเป็นการจบท้ายลูปในแต่ละครั้ง หลักการทำงานของ for-loop จะคล้ายกับ while-do-loop
การใช้งาน for-loop และวางตำแหน่งส่วนต่างๆ อาจจะไม่จำเป็นต้องทำเหมือนกันแต่ให้ผลเหมือนกัน เช่น

<?
$x=1;
for ( ; $x <=10; $x++) {
echo $x*$x,"<BR>\n";
}
$x=1;
for ( ; $x <=10; ) {
echo $x*$x,"<BR>\n";
$x++;
}
?>
จากตัวอย่างข้างบนที่ผ่านๆมา เป็นการวนลูปจะใช้การนับเลขเพิ่มขึ้นทีละหนึ่ง เรายังสามารถเขียนใหม่โดยเป็นการนับเลขลดลง ยกตัวอย่างเช่น เราต้องการจะพิมพ์ตัวเลขเรียงลำดับจาก 10,9,8...,1 ก็อาจจะเขียนคำสั่งได้ดังนี้

<?
for ($x=10 ; $x >0; $x--) {
echo $x,"<BR>\n";
}
?>
การใช้งาน for-loop ก็จะเหมือนกับเวลาใช้ในภาษาซี ในหลายๆเรื่อง เช่น เราสามารถใส่คำสั่งได้ มากกว่าหนึ่งโดยใช้เครื่องหมาย (,) เป็นตัวแยก ตัวอย่างเช่น

<?
for ($x=1, $y=0 ; $x < 10; $x++, $y--) {
echo "$x $y<BR>\n";
}
?>
ภาษาแบบ scripting language ในปัจจุบันหลายๆภาษาก็สนับสนุนการเขียนโปรแกรมเชิงวัตถุด้วย ตัวอย่างเช่น Perl และ PHP ก็รวมอยู่ในนั้นด้วย แม้ว่าจะไม่ซับซ้อนเหมือนอย่างภาษาซีพลัสพลัสหรือจาวาก็ตาม
คลาสคือโครงสร้างที่ประกอบด้วยสมาชิก (class members) หรือคุณสมบัติ (properties) ตามแต่จะเรียก และ ฟังก์ชันสมาชิก (member functions) การนิยามคลาสขึ้นมาใช้งานจะเริ่มด้วย class { ... } โดยข้างในจะมีส่วนของตัวแปรสมาชิก และฟังก์ชันสมาชิกตามลำดับ ฟังก์ชันที่มีชื่อเดียวกับคลาสจะเรียกว่า class constructor ทุกครั้งที่มีการสร้างออปเจคจากคลาสโดยใช้คำสั่ง new ฟังก์ชันที่ทำหน้าที่เป็น class constructor ก็จะถูกเรียกมาทำงานก่อนทุกครั้ง ประโยชน์ของการใช้งานก็เช่น ใช้กำหนดค่าเริ่มต้น หรือเตรียมพร้อมก่อนที่จะเริ่มใช้ออปเจค
ลองดูตัวอย่าง การเขียนคลาสสำหรับแบบข้อมูลเชิงนามธรรม (Abstract Data Type) ที่เรียกว่า stack การทำงานของ stack ก็เป็นดังนี้ ถ้าเราใส่ข้อมูลเข้าไป ข้อมูลเหล่านั้นก็จะถูกเก็บไว้เสมือนกับว่า วางซ้อนกันจากข้างล่างขึ้นข้างบน ถ้าเราจะดึงข้อมูลออกมาใช้ก็จะได้ข้อมูลที่อยู่ข้างบนสุด ซึ่งก็คือข้อมูลที่เราใส่เข้าไปครั้งล่าสุดนั่นเอง หน้าที่ของ stack ที่สำคัญก็มีเช่น
push() //ใส่ข้อมูลไว้ใน stack
pop() // ดึงข้อมูลออกมา
is_empty() // ตรวจดูว่า stack มีข้อมูลอยู่อีกหรือไม่
get_size() // หาจำนวนของข้อมูลที่ถูกเก็บไว้ใน stack

ตัวอย่างการสร้างคลาส stack ในภาษา PHP ทำได้ดังตัวอย่างต่อไปนี้

<?
class stack {
var $arrays;
var $size;
function stack() { // class constructor
$this->size = 0;
unset($this->arrays);
}
function push($elem) { // put an element on stack
$this->arrays[$this->size] = $elem;
$this->size++;
}
function get_size() { // get number of elements stored
return $this->size;
}
function is_empty() { // is stack empty ?
return ($this->size == 0) ? true : false;
}
function pop() { // retrieve an element from the top of stack
if ( $this->is_empty() == false ) {
$this->size--;
return $this->arrays[$this->size];
}
else
return 0;
}
}
$inst = new stack; // create an object from stack class
echo "initial stack size=".($inst->get_size()),"<BR>\n";
for ($i=0; $i < 10; $i++) {
$inst->push( ($i*7)%11 );
}
echo "current stack size=".($inst->get_size()),"<BR>\n";
while (! $inst->is_empty() ) {
echo "pop ".$inst->pop(),"<BR>\n";
}
echo "stack is ".($inst->is_empty() ? "empty." : "not empty.")."<BR>\n";
$inst = 0; // unuse this instance of class stack
?>
โปรดสังเกตว่า ตัวแปร $this ที่ปรากฎอยู่ในคลาสจะเหมือน this ที่เราใช้ในภาษาซีพลัสพลัส และการนิยามและสร้างฟังก์ชันสมาชิกจะทำภายในคลาสทั้งหมด (เหมือนในภาษาจาวา)
PHP ยังสนับสนุนการสืบทอดคุณสมบัติของคลาส (inheritance) ทำให้เราสามารถสร้างคลาสขึ้นมาใหม่ โดยใช้คลาสที่มีอยู่เดิมและเพื่อส่วนขยายเข้าไป การสืบสอดคุณสมบัติจากคลาสหนึ่งไปยังอีกคลาสหนึ่ง จะใช้คำสั่ง extends คล้ายกับของภาษาจาวา ตามตัวอย่างดังนี้

<?
class stack {
var $arrays;
var $size;
function stack() {
echo "DEBUG> stack constructor<BR>\n";
$this->size = 0;
unset($this->arrays);
}
function push($elem) {
$this->arrays[$this->size] = $elem;
$this->size++;
}
function get_size() {
return $this->size;
}
function is_empty() {
return ($this->size == 0) ? true : false;
}
function pop() {
if ( $this->is_empty() == false ) {
$this->size--;
return $this->arrays[$this->size];
}
else
return 0;
}
}
// class LimitedStack is derived from class stack.
class LimitedStack extends stack {
var $max_size;
function LimitedStack ($capacity = 10) {
$this->stack(); // call stack's constructor explicitly.
echo "DEBUG> LimitedStack constructor<BR>\n";
$this->max_size = $capacity;
}
function is_full() {
return ($this->max_size <= $this->size) ? true : false;
}
function push($elem) {
if ($this->is_full() == false) {
$this->arrays[$this->size] = $elem;
$this->size++;
}
else {
echo "stack is full!\n";
}
}
}
$inst = new LimitedStack(5);
echo "initial stack size=".($inst->get_size()),"<BR>\n";
for ($i=0; $i < 10; $i++) {
if (! $inst->is_full() ) {
$inst->push( ($i*7)%11 );
}
else break;
}
echo "current stack size=".($inst->get_size()),"<BR>\n";
echo "stack is ".($inst->is_empty() ? "empty." : "not empty.")."<BR>\n";
?>

คลาส LimitedStack นี้มีคุณสมบัติที่ได้รับมาจากคลาส stack แต่แตกต่างตรงที่ว่า เราได้กำหนดความจุ ของ LimitedStack เอาไว้ โดยตัวแปร $max_size ผู้ใช้จะต้องกำหนดขนาดความจุของออปเจคจากคลาส LimitedStack ก่อนใช้ ถ้าไม่กำหนดก็จะใช้ค่า 10 เป็นค่าความจุโดยอัตโนมัติตามตัวอย่าง (เป็น default parameter)
เมื่อมีการกำหนดความจุก็จะต้องมีการเขียนฟังก์ชันสมาชิกเพิ่มขึ้นอีก ชื่อ is_full() เพื่อตรวจสอบดูว่า จำนวนของข้อมูลใน stack เท่ากับความจุที่กำหนดไว้แล้วหรือไม่
โปรดสังเกตว่า PHP สนับสนุนการนิยามฟังก์ชันทับฟังก์ชันเดิมของคลาสที่ได้รับคุณสมบัติมา และสิ่งที่จะลืมไม่ได้คือ constructor จากคลาสลูก (child class) จะไม่เรียกใช้ constructor จากคลาสแม่ (parent class) จะต้องมีการเรียกใช้อย่างเจาะจง

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


<?
// array of objects
class MyObj {
var $id;
function MyObj( $set_id) {
// $id = $set_id; <-- this does't work if you forget to use $this
$this->id = $set_id;
}
function show() {
echo "hello world $this->id<BR>\n";
}
}
// can create the array of objects
$obj_array = array();
$obj_array[] = new MyObj(1);
$obj_array[] = new MyObj(2);
$obj_array[] = new MyObj(3);
// To access each object we must use help variable like follows:
for($i=0; $i < count($obj_array); $i++) {
$tmp = $obj_array[$i];
$tmp->show();
}
?>

จากตัวอย่างเราใช้ตัวแปร $tmp ในการเข้าถึงออปเจคแต่ละตัวในถูกเก็บไว้ในอาร์เรย์ $obj_array เนื่องจากเราไม่สามารถเรียกใช้ฟังก์ชันของออปเจคได้โดยตรงถ้าออปเจคอยู่ในอาร์เรย์ เช่น $obj_array[0]->show();
การตรวจดู webbrowser ของผู้มาเยือนว่าเป็นตัวไหน

อีกตัวอย่างหนึ่งที่แสดงให้เห็นการใช้ตัวแปรแบบ global ซึ่งเป็นตัวแปรที่ตัวแปลชุดคำสั่ง PHP ได้สร้างขึ้น ทุกครั้งที่ทำงาน หนึ่งในตัวแปรนั้นคือ $HTTP_USER_AGENT

<?
function getBrowserName() {
global $HTTP_USER_AGENT;
$browser=strtoupper($HTTP_USER_AGENT);
if (strstr($browser,"MSIE"))
return "MS Internet Explorer";
else if (strstr($browser,"MOZILLA"))
return "Netscape";
else
return "";
}
$name = getBrowserName();
if ($name != "") {
echo "Your browser is ".$name.".<BR>";
}
?>
จากตัวอย่าง เราสามารถใช้ตัวแปรดังกล่าวในการตรวจดูว่า ผู้ใช้ได้ใช้ web browser ตัวไหน เช่น ระหว่าง IE (Microsoft Explorer) หรือ Mozilla (Netscape)
การอ่านตัวแปรจากภายนอกที่ได้จากการ Web browser โดยวิธี GET หรือ POST
สมมุติว่า เรามีฟอร์มสำหรับให้ผู้ใช้ป้อนชื่อ (login) และรหัสผ่าน (password) จากนั้นก็ส่งมายัง Webserver และใช้สคริปต์ PHP เป็นตัวจัดการกับข้อมูลที่ส่งมาโดยวิธีการแบบ POST ตามตัวอย่าง
Sample1.php
- แบบ Post

<form action="Sample2.php" method="post">
<table>
<tr><td>login:</td>
<td><input type="text" name="login"></td>
</tr><br>
<tr><td>password:</td>
<td><input type="text" name="password"></td>
</tr><br>
</table>
<p><input type="submit">
</form>
Sample1.php
- แบบ Get

<form action="Sample2.php" method="get">
<table>
<tr><td>login:</td>
<td><input type="text" name="login"></td>
</tr><br>
<tr><td>password:</td>
<td><input type="text" name="password"></td>
</tr><br>
</table>
<p><input type="submit">
</form>
ภายในสคริปต์ Sample2.php เราสามารถอ่านข้อมูลที่ส่งมาได้ ในกรณีนี้ ที่เราสนใจคือ ค่าจาก login และ password ที่อยูในฟอร์ม และสามารถจะอ่านข้อมูลเหล่านั้นได้ เพราะ PHP จะเก็บข้อมูลไว้ในตัวแปรชื่อ $login และ $password ตามลำดับ ตัวอย่างเช่น Sample2.php อาจจะเป็นสคริปต์ง่ายๆดังนี้
ตัวอย่างไฟล์ Sample2.php

<HTML>
<HEAD><TITLE> Result </TITLE></HEAD>
<BODY>
<P> Your login = <? echo "$login" ?>
<BR> Your password = <? echo "$password"; ?>
</BODY>
</HTML>

เราสามารถอ่านข้อมูลที่ได้จากการส่งแบบ GET ได้เช่นกัน

ตัวอย่างเช่น

<a href="print.php?ID=103543564&mode=plaintext"> click </a>

เมื่อผู้ใช้คลิ้กที่ link ก็จะติดต่อกับสคริปต์ที่ชื่อว่า print.php โดยผ่านข้อมูลสองตัวคือ ID และ mode
ภายในสคริปต์ เราก็ใช้ $ID และ $mode สำหรับอ่านค่าของข้อมูลที่ส่งมา ในตัวอย่างนี้ $ID จะได้ค่าเป็น "103543564" และ $mode ได้ค่า "plaintext"
คำสั่งที่ใช้อ่านค่าจาก ค่า ของ Form เราสามารถเรียกใช้จากตัวแปรที่เราตั้งขึ้นมาได้เลย
รูปแบบ
$var-name
หากต้องการพิมพ์ข้อความออกมา
echo"$var-name";
ดูเพิ่มเติมได้ครับ
- HTML Form
เป็นการกำหนดกรอบ ที่ข้อมูลที่จะมีการส่ง

รูปแบบ

<form=" [action=url]" name="ชื่อฟอร์ม" method="[post/get]">
.
code
.
</form>


- Submit
ช่วยส่งค่าจากส่วนประกอบต่างๆ ใน Form ไปยัง Web Server เพื่อทำการประมวลผล
รูปแบบ
<input type="submit" value="[comment]">
- Reset
จะทำหน้าที่ Clear ส่วนข้อมูลที่ได้ทำการใส่เข้าไปใน Textbox โดยจะทำการ Clear ข้อความใดๆ ที่ได้ทำการใส่เข้าไปใน Tab <Form> </form>
รูปแบบ
<input type="reset" value="Reset">

TOP