ในการเขียนโปรแกรมทุกๆ โปรแกรม ต้องมีการคำนวนเข้ามาเกี่ยวข้องด้วยเสมอ แล้วสิ่งที่ใช้คำนวนนั้นก็คือตัวดำเนินการทางคณิตศาสตร์ที่เรารู้จักกันนั่นเอง ตัวดำเนินการทางคณิตศาสตร์ในภาษา PHP ก็เหมือนกับภาษาอื่นๆ สำหรับท่านที่เขียนโปรแกรมได้แล้ว อาจจะข้ามตรงนี้ไปเลยก็ได้ครับ เพราะเหมือนเอาของเก่ามาเล่าใหม่ เล่ากี่ที กี่ที มันก็ไม่ต่างไปจากเดิมเท่าไหร่หรอกครับ แต่สำหรับท่านที่กำลังเริ่มเขียนโปรแกรมแล้ว จุดนี้ ถือเป็นสิ่งที่ต้องรู้และต้องเข้าใจด้วย ไม่เช่นนั้นแล้ว อาจจะเขียนโปรแกรมเพื่อที่จะใช้งานจริงๆ ไม่ได้เลย
ตัวดำเนินการกำหนดค่า
การกำหนดค่าให้ตัวแปร ใช้เครื่องหมาย = (เท่ากับ) ในการกำหนดค่า วิธีการจำง่ายๆ ก็คือ สิ่งที่ทำด้านขวา (เช่นการคำนวน หรือ ข้อความ) จะถูกส่งไปยังด้านซ้าย ตามตัวอย่าง
<?php $a = "cmdevhub"; // $a เ้ก็บข้อความว่า cmdevhub $b = 1; // $b เก็บตัวเลข 1 $c = 1 + 2; // $c เก็บผลลัพท์จากการคำนวนด้านขวา คือ 3 $d = $c + 3; // ผลลัพท์ $d เก็บค่า 6 เนื่องจาก $c เก็บค่า 3 ไว้อยู่แล้ว ?>
ตรงนี้ไม่ค่อยยากเท่าไหร่ หวังว่าทุกๆ ท่านจะเข้าใจนะครับ ถ้าหากไม่เข้าใจ ก็ให้พยายามทำความเข้าใจให้ได้ครับ ไม่เช่นนั้นจะไปต่ออีกไม่ได้เลย
(จริงๆ แล้วคำสั่ง += , -= , *= , /= , %= ก็จัดอยู่ในหมวดนี้ แต่ผมขอแยกออกไปอยู่ในตัวดำเนินการเชิงคณิตศาสตร์ล่ะกันครับ)
ตัวดำเนินการเชิงคณิตศาสตร์
เป็นเครื่องหมายทางคณิตศาสตร์ทั่วๆ ไป ที่เราคุ้นเคยกันดีอยู่แล้ว คือ บวก (+) ลบ (-) คูณ (*) หาร (/) แต่จะมีตัวพิเศษเพิ่มขึ้นมาอีกตัวหนึ่งคือ หารเอาเศษ (%) ลองดูตัวอย่างกันครับ
$a + $b | $a บวก $b |
$a – $b | $a ลบ $b |
$a * $b | $a คูณ $b |
$a / $b | $a หาร $b |
$a % $b | $a หาร $b แต่เอาเศษ |
<?php $a = 5; $b = 2; $a + $b; // ผลลัพธ์ 7 $a - $b; // ผลลัพธ์ 3 $a * $b; // ผลลัพธ์ 10 $a / $b; // ผลลัพธ์ 2 $a % $b; // ผลลัพธ์ 1 ?>
ตรง $a / $b นั้น เป็นแค่ทางทฤษฎีนะครับ แต่ในภาษา PHP นั้น เนื่องจากการประกาศตัวแปรไม่มีการบอกว่าเป็นชนิดไหน จึงทำให้ผลลัพธ์จากการหารนั้น เป็นจำนวนทศนิยมไปด้วย สำหรับการหารเอาเศษ ข้อสังเกตง่ายๆ ว่าผลลัพธ์ถูกหรือไม่คือ ค่าที่ได้ จะเป็นเลขตั้งแต่ 0 ไปจนถึงตัวหารลบด้วย 1 เช่น หารด้วย 8 เศษที่ได้จะมีตั้งแต่ 0 จนถึง 7 เท่านั้น
ตัวดำเนินการทางคณิตศาสตร์สามารถคำนวน และกำหนดค่าให้ตัวแปรได้เลย โปรแกรมจะทำการคำนวนผลลัพธ์ให้เสร็จเสียก่อน แล้วจึงกำหนดค่าให้กับตัวแปรนั้นๆ ลองดูตัวอย่างกันครับ
<?php $a = 5; $b = 2; $c = 3 + 4; // ทำการคำนวน 3 + 4 ก่อน และค่อยกำหนดค่าให้ $c $d = $a + $b; // ทำการคำนวนก่อนเช่นกัน $a = $a + 5; // นำค่าในตัวแปร $a ไปบวกกับ 5 และกำหนดค่าที่ได้ให้ตัวแปร $a $b = $b + $c; // นำค่าในตัวแปร $b ไปบวกกับค่าของ $c และกำหนดค่าที่ได้ให้ตัวแปร $b ?>
จากตัวอย่าง จะเห็นว่า เราสามารถทำการคำนวนและกำหนดค่าได้ในครั้งเดียว ลองสังเกตุตรงที่ การนำตัวแปรไปคำนวน และกำหนดค่าให้ตัวมันเอง เราสามารถเขียนย่อลงได้ เพื่อให้โปรแกรมสั้นลง และทำงานได้เร็วขึ้น ดังนี้
$a = $a + $b; | $a += $b; |
$a = $a – $b; | $a -= $b; |
$a = $a * $b; | $a *= $b; |
$a = $a / $b; | $a /= $b; |
$a = $a % $b; | $a %= $b; |
ทั้งสองแบบ ได้ผลลัพท์ที่เหมือนกัน เขียนโปรแกรมใหม่ๆ อาจจะ งง กันพอสมควรครับ แต่ถ้าทำไปนานๆ แล้วจะคล่องเอง อันนี้ก็ต้องพยายามกันเยอะๆ หน่อยนะครับ ที่สำคัญ การเขียนแบบย่อ โปรแกรมจะทำงานได้เร็วกว่าครับ เพราะทำการ get operand 1 ครั้ง get operator 2 ครั้ง แต่ถ้าหากเขียนแบบเต็มจะ get operand 2 ครั้ง get operator 3 ครั้ง ไว้เรามาเขียนโปรแกรมหาความแตกต่างในโอกาสต่อไปนะครับ (แน่นอน ต้องภาษา C เท่านั้น)
สำหรับความสำคัญของเครื่องหมาย ก็ต้องเอามาคิดด้วยครับ เพราะไม่เช่นนั้น ผลลัพท์ที่คำนวนมาได้ จะไม่ถูกต้องตามที่เราต้องการ ระดับความสำคัญของเครื่องหมายตามตารางนี้เลยครับ
เครื่องหมาย | ความหมาย | ระดับ |
( ) | วงเล็บเปิด / ปิด | 3 |
*, /, % | คูณ, หาร, หารเอาเศษ | 2 |
+, – | บวก, ลบ | 1 |
การคำนวนต้องคำนึงถึงระดับความสำคัญของเครื่องหมาย เพื่ออะไร? งั้นลองดูตัวอย่างกันเลยครับ (ในบางภาษาเช่น Python จะมียกกำลังด้วย ความสำคัญจะสูงกว่า *, /, % นะครับ)
<?php echo 2 + 3 * 5; ?>
อ่า… คิดว่าผลลัพท์ที่ได้ จะเป็นอะไร? ระหว่าง 30 หรือ 17 คำตอบนั้น ลองไปรันเองเลยล่ะกันครับ แต่แล้ว ทำไมผลลัพท์ถึงเป็นแบบนี้ เพราะว่าลำดับความสำคัญของเครื่องหมาย * มีมากกว่า + จึงมีการคำนวนในเทอมของ * ก่อน เสร็จแล้วจึงมาทำการ + ซึ่งรูปแบบการคำนวนนี้ เหมือนกันทุกภาษาครับ ถ้าหากท่านใดเคยเรียน data structure มา คงจะเคยเล่น in fix กับ post fix กันอย่างสนุกสนานล่ะครับ
ลองมาคิดกันเล่นๆ ต่อครับ
<?php echo 10 - 2 * 15 / 3 - 2; echo 10 - 2 * (15 / 3) - 2; echo 10 - 2 * 15 / (3 - 2); echo (10 - 2) * 15 / (3 - 2); echo (10 - 2) * 15 / 3 - 2; echo 10 - (2 * (15 / (3 - 2))); ?>
จากผลลัพท์ที่ได้ จะสังเกตุได้ว่า ถ้าหากความสำคัญของเครื่องหมายมีเท่ากัน จะทำตามลำดับก่อนหลังของเครื่องหมาย ส่วนวงเล็บนั้น จะทำจากด้านในออกมาด้านนอกเสมอ แต่ถ้าหากวงเล็บอยู่ในระดับที่เท่ากัน จะทำตามลำดับก่อนหลัง
ตัวเพิ่มค่า (Increment) ลดค่า (Decrement)
ตัวเพิ่มค่า เขียนโดยใช้เครื่องหมาย บวกสองตัวต่อกัน (++) ใช้สำหรับเพิ่มค่าตัวแปรทีละ 1 ส่วนตัวลดค่า เขียนโดยใช้เครื่องหมายลบสองตัวต่อกัน (–) ใช้สำหรับลดค่าตัวแปรทีละ 1
<?php // ตัวอย่างการเพิ่มค่าทีละ 1 $a = 1; $a = $a + 1; $a += 1; // สามารถใช้คำสั่งเพิ่มค่าได้ดังนี้ $a++; ?>
จากตัวอย่าง จะเห็นว่า ผลลัพท์ของทั้ง 3 แบบ จะได้เหมือนกันหมด แล้วจะมีมาเพื่ออะไร?
ใน CPU ทุกตัว จะมีคำสั่ง ADD และ INC อยู่ด้วย ซึ่งคำสั่ง INC จะใช้ CPU Time น้อยกว่าคำสั่ง ADD อยู่แล้ว สมมุติ... ใน CPU แบบ CISC (ตระกูล X86) แต่ละคำสั่ง จะใช้ CPU Time (Clock Cycle) ไม่เท่ากัน ผมให้ INC = 1 clock ADD = 2 clock ถ้ามีการวนลูปสัก 1 ล้านรอบ ก็มีความต่างกันถึง 1 ล้าน Clock อาจจะฟังดูน้อยเพราะ CPU ทำงานเร็วอยู่แล้ว แต่ถ้าเป็นเว๊ปใหญ่ๆ แล้วคนเ้ข้าเยอะๆ อันนี้มีผลแน่นอน (ส่วน CPU ตระกูล RISC พวก Sparc ของ SUN ก็คิดอีกแบบ แต่ผลลัพท์ก็คล้ายๆ กันครับ)
ตัวเพิ่มค่า ละลดค่า สามารถเขียนได้ 2 ตำแหน่งคือ หน้าตัวแปร และ หลังตัวแปร
++$a , $a++ | เพิ่มค่าทีละ 1 |
–$a, $a– | ลดค่าทีละ 1 |
ถ้าหากเราวางเครื่องหมายไว้หน้าตัวแปร ก็จะทำการเพิ่มตัวแปรนั้นก่อน จึงจะทำคำสั่งอื่นๆ ที่อยู่ในบรรทัดนั้น แต่ถ้าหากวางเครื่องหมายไว้หลังตัวแปร จะทำคำสั่งอื่นๆ ให้หมดก่อน ลองดูตัวอย่างตามนี้นะครับ
<?php $a = 1; echo $a++; // ผลลัพท์ 1 เนื่องจากทำคำสั่ง echo ก่อน จึงทำการเพิ่มค่า $a = 1; echo ++$a; // ผลลัพท์ 2 เนื่องจากทำการเพิ่มค่าก่อน แล้วจึงทำคำสั่ง echo $a = 1; echo 1 + $a++; // ผลลัพท์ 2 เนื่องจากทำการบวก 1 และ echo ก่อนจึงทำการเพิ่มค่า $a = 1; echo 1 + ++$a; // ผลลัพท์ 3 เนื่องจากทำการเพิ่มค่าก่อน และบวก 1 แล้วจึงทำคำสั่ง echo ?>
จะ้เห็นว่า การวางเครื่องหมายด้านหน้า หรือด้านหลัง ให้ผลลัพท์ที่แตกต่างกันอย่างมาก หลายๆ ท่านที่ผมเคยคุยด้วย ก็เคยตกม้าตายเพราะตำแหน่งของเครื่องหมายนี่แหละครับ ดังนั้นก็ให้ระมัดระวังในการเขียนด้วยนะครับ
ตัวเชื่อมข้อความ
ในภาษา PHP การกำหนดตัวแปรเป็นข้อความ (String) สามารถทำได้ 2 แบบคือใช้เครื่องหมาย Singe Quote (‘) หรือ Double Quote (“) ถ้าต้องการนำข้อความหลายๆ ข้อความมาต่อกัน สามารถใช้เครื่องหมายจุด (.) เพื่อทำให้ตัวแปรเชื่อมต่อกัน หรือจะใช้เครื่องหมายจุด เพื่อเชื่อมข้อความกับตัวแปรก็ได้ ลองดูตัวอย่างกันครับ
<?php $a = "Hello" . "World"; $b = "Hello"; $b = $b . "World"; $c = "http:/www.cmdevhub.com"; $c.= "โปรแกรมที่ไม่มีบักคือโปรแกรมที่ยังไม่ได้เขียน"; // ท่องเอาไว้ครับ อิอิ $total = 100; echo "Total Price = " . $total; ?>
การนำข้อความมาเชื่อมกับตัวแปรเดิม สามารถเขียนได้ 2 แบบ ตามตัวอย่างข้างบนนะครับ
การเชื่อมข้อความ ดูแล้วเหมือนไม่ยาก ถ้าหากใช้บ่อยๆ แล้วจะคล่องเองครับ
ตัวเปรียบเทียบ
ตัวเปรียบเทียบในทุกๆ ภาษา จะเปรียบเทียบตัวซ้าย เทียบกับตัวขวา และได้ผลลัพท์เป็น จริง (true) หรือ เท็จ (false) เท่านั้น ในภาษา PHP ก็มีวิธีการเปรียบเทียบเหมือนกับภาษาอื่นๆ เหมือนกัน ผลลัพท์ที่ได้ก็มีแต่ จริง และ เท็จ เท่านั้น เหมือนกัน ตัวเปรียบเทียบ จะใช้ในการกำหนดทิศทางของโปรแกรม
$a < $b | น้อยกว่า | คืนค่าเป็นจริง ถ้า $a น้อยกว่า $b |
$a > $b | มากกว่า | คืนค่าเป็นจริง ถ้า $a มากกว่ากว่า $b |
$a <= $b | น้อยกว่า หรือ เท่ากับ | คืนค่าเป็นจริง ถ้า $a น้อยกว่า หรือ เท่ากับ $b |
$a >= $b | มากกว่า หรือ เท่ากับ | คืนค่าเป็นจริง ถ้า $a มากกว่า หรือ เท่ากับ $b |
$a == $b | เท่ากับ | คืนค่าเป็นจริง ถ้า $a เท่ากับ $b |
$a != $b | ไม่เท่ากับ | คืนค่าเป็นจริง ถ้า $a ไม่เท่ากับ $b |
$a === $b | เท่ากับทั้งหมด | คืนค่าเป็นจริง ถ้า $a เท่ากับ $b และ ต้องเป็นชนิดข้อมูลเดียวกัน |
การเปรียบเทียบ === ทั้งค่าในตัวแปร และ ชนิดตัวแปร ต้องเหมือนกัน จึงจะไ้ด้ค่าจริงกลับมา แต่ == ค่าเท่ากัน แต่ตัวแปรเป็นคนละชนิด ก็ได้ค่าจริงกลับมาแล้ว จริงๆ แล้ว เครื่องหมาย === ไม่ค่อยได้ใช้เท่าไหร่หรอกครับ
<?php $a = 1; $b = 2; $c = "1"; $a < $b; // true $a > $b; // false $a <= $b; // true $a <= $c; // true $a >= $b; // true $a >= $c; // true $a == $b; // false $a == $c; // true $a === $b; // false $a === $c; // false ?>
เห็นไหมครับ ไม่ยากเลย กับการเปรียบเทียบตัวแปร ยังไงก็ระวังในการใช้งานได้นะครับ ถ้าหากกำหนดเงื่อนไขผิด โปรแกรมก็จะทำงานผิดไปเลย ระวังด้วย
ตัวดำเนินการทางตรรกศาสตร์
ในการเปรียบเทียบค่า เราสามารถเปรียบเทียบได้หลายๆ ค่าพร้อมกัน โดยใช้ตัวเปรียบเทียบทางตรรกศาสตร์มาช่วยหาคำตอบสุดท้ายของการเปรียบเทียบ ตัวเปรียบเทียบ จะมีเพียง 4 ตัวคือ and , or , not , xor
and หรือ && | ได้ค่าจริง เมื่อเป็นจริงทั้งหมด |
or หรือ || | ได้ค่าเท็จ เมื่อเป็นเท็จทั้งหมด |
not หรือ ! | กลับค่า จากจริงเป็นเท็จ และ เท็จเป็นจริง |
xor | ตัวเปรียบเทียบ เหมือนกัน ได้ค่าเท็จ ต่างกันได้จริง |
ถ้าเขียนเป็นตาราง จะได้ค่าตามนี้ (ผมให้ 0 = false และ 1 = true)
$a | $b | $a && $b | $a || $b | $a xor $b | !$a |
0 | 0 | 0 | 0 | 0 | 1 |
0 | 1 | 0 | 1 | 1 | 1 |
1 | 0 | 0 | 1 | 1 | 0 |
1 | 1 | 1 | 1 | 0 | 0 |
ดูจากตารางแล้ว ถ้าเคยเรียน Digital มาก่อน คงจะเข้าใจไม่ยาก แต่ถ้ายังไม่เข้าใจ ก็ลองท่องตรงนี้เอาครับ
and เป็นจริงเมื่อเป็นจริงทั้งหมด นอกนั้นเป็นเท็จ
or เป็นเท็จเมื่อเป็นเท็จทั้งหมด นอกนั้นเป็นจริง
xor เหมือนกันเป็นเท็จ ต่างกันเป็นจริง
not จริงเป็นเท็จ เท็จเป็นจริง
(ปล. สูตรใครสูตรมันนะครับ แต่ผมจับใจความมาได้แบบนี้อ่ะ)
ตัวเปรียบเทียบบิต
… เดี๋ยวค่อยมาต่อครับ ไม่ค่อยได้ใช้หรอกอ่ะ