ตัวดำเนินการ II

27 December 2016

ในบทนี้ เราจะพูดเกี่ยวกับตัวดำเนินการเปรียบเทียบ ตัวดำเนินการตรรกศาสตร์ และลำดับความสำคัญของตัวดำเนินการในภาษา PHP

Comparison Operators

ตัวดำเนินการเปรียบเทียบ (Comparison Operators) คือตัวดำเนินการที่ใช้สำหรับเปรียบเทียบระหว่างค่าสองค่า ผลลัพธ์ของการเปรียบเทียบจะได้เป็น Boolean ที่มีค่าเป็นเพียง True หรือ False เท่านั้น ตัวดำเนินการเปรียบเทียบมักจะใช้สำหรับคำสั่งเลือกเงื่อนไขหรือวนซ้ำ ในการเขียนโปรแกรม เราใช้ตัวดำเนินการเหล่านี้เพื่อสร้างเงือนไขให้โปรแกรมทำงานตามที่ต้องการ

ในภาษา PHP เนื่องจากตัวแปรเป็นแบบ Typeless ดังนั้นค่าของตัวแปรอาจจะมีความหมายเท่ากันในบางบริบท เช่น ค่าของ True นั้นอาจจะเท่ากับ 1 และค่าของ False อาจจะเท่ากับ 0 คุณสามารถดูเพิ่มเติมได้ในเรื่องการเท่ากันของข้อมูล ในบทตัวแปรและประเภทข้อมูล

นี่เป็นรายการของตัวดำเนินการเปรียบเทียบในภาษา PHP

Operator Example  Result
==$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 ไม่เช่นนั้นเป็นเท็จ
!==$a !== $bเป็นจริงถ้าทั้งค่าและประเภทของตัวแปร a ไม่เท่ากับ b ไม่เช่นนั้นเป็นเท็จ

ต่อไปเป็นตัวอย่างการใช้ตัวดำนำเนินการในการเปรียบเทียบค่าในตัวแปรในภาษา PHP

<?php

$a = 5;
$b = 10;

if ($a == $b) {
    echo "a is equal to b\n";
} else {
    echo "a is not equal to b\n";
}

if ($a < $b) {
    echo "a is less than b\n";
} else {
    echo "a is not less than b\n";
}

if ($a % 2 == 0) {
    echo "a is even number\n";
} else {
    echo "a is odd number\n";
}

?>

ในตัวอย่าง เรามีตัวแปรสองตัวคือ $a และ $b และได้กำหนดค่าให้กับตัวแปรเหล่านี้ เราใช้ตัวดำเนินการเปรียบเทียบกับคำสั่งเงื่อนไข If เมื่อเงื่อนไขเป็นจริงคำสั่งในบล็อคของ If จะทำงาน และถ้าไม่เป็นจริงคำสั่งในบล็อคของ Else จะทำงาน

ในคำสั่ง if ($a == $b) เป็นการตรวจสอบถ้าหากตัวแปรมีค่าเท่ากัน เนื่องจากค่าในตัวแปรทั้งสองไม่เท่ากัน โปรแกรมจึงทำงานในบล็อคของ Else ในคำสั่ง if ($a < $b) เป็นการตรวจสอบถ้าหากตัวแปร $a มีค่าน้อยกว่า $b ซึ่งเป็นจริง และในคำสั่งสุดท้าย if ($a % 2 == 0) เป็นการตรวจสอบถ้าหาก $a เป็นเลขคู่จากหารเอาเศษ ซึ่งเป็นเท็จ

a is not equal to b
a is less than b
a is odd number

นี่เป็นผลลัพธ์เมื่อรันโปรแกรม

มาดูตัวอย่างเพิ่มเติมในการเขียนโปรแกรมที่จำเป็นต้องใช้ตัวดำเนินการเปรียบเทียบเหล่านี้ ซึ่งเป็นโปรแกรมในการนับจำนวนของผู้เข้าชมหน้าเว็บไซต์

<?php

$view = 1823073;

$str_view = "";

if ($view == 0) {
    $str_view = "no view yet";
} else if ($view == 1) {
    $str_view = "1 view";
} else if ($view < 1000) {
    $str_view = "$pageview views";
} else if ($view < 1000000) {
    $str_view = number_format($view / 1000, 1) . "K views";
} else if ($view < 10E9) {
    $str_view = number_format($view / 1000000, 1) . "M views";
} else {
    $str_view = number_format($view / 10E9, 1) . "B views";
}

echo "This page has " . $str_view . ".";

?>

ในตัวอย่าง เป็นโปรแกรมในการนับจำนวนการดูหน้าของเว็บไซต์ ในตัวแปร $view เป็นจำนวนครั้งทั้งหมดของการดู เราได้ใช้คำสั่ง If ในการตรวจสอบเพื่อให้เป็นการแสดงข้อมูลในรูปแบบที่สั้นขึ้น เช่น ถ้าหากมีการดู 1,000,000 ครั้ง เราจะแสดง 1M แทน

This page has no view yet.
This page has 34 views.
This page has 5.6K views.
This page has 1.8M views.

นี่เป็นผลลัพธ์ของโปรแกรมเมื่อเราเปลี่ยนค่าของ $view เป็น 0, 34, 5625 และ 1823073 ตามลำดับ

ต่อไปเป็นตัวอย่างในการเปรียบเทียบค่าของข้อมูลต่างประเภทกัน แต่ค่าอาจจะเท่ากันเมื่อนำไปใช้เหมือน Boolean

<?php

$x = 1;
$y = "1";

echo "x == y -> ", var_dump($x == $y);
echo "x === y -> ", var_dump($x === $y);

$is_rain = 1;
if ($is_rain) {
    echo "It is raining now.\n";
}

$male = true;
if ($male) {
    echo "You are a boy.\n";
} else {
    echo "You are a girl.\n";
}

echo "is_rain == male -> ", var_dump($is_rain == $male);
echo "is_rain === male -> ", var_dump($is_rain === $male);

?>

ในตัวอย่าง เป็นการเปรียบเทียบความเท่ากันของข้อมูลต่างประเภทกัน ซึ่งข้อมูลประเภทอื่นที่ไม่ใช่ Boolean เมื่อถูกนำมาใช้ในบริบทของ Boolean เช่น การเปรียบเทียบ การใช้กับคำสั่งเลือกเงือนไขหรือคำสั่งวนซ้ำ มันสามารถทำงานเหมือน Boolean ได้

$x = 1;
$y = "1";

echo "x == y -> ", var_dump($x == $y);
echo "x === y -> ", var_dump($x === $y);
echo "x + y -> ", var_dump($x + $y);

ในตัวอย่าง เรามีตัวแปร $x ซึ่งเป็นข้อมูลแบบ Integer และตัวแปร $y เป็นข้อมูลแบบ String เมื่อนำข้อมูลมาเปรียบเทียบกันด้วยตัวดำเนินการ == จะได้ผลลัพธ์เป็น true แต่เมื่อนำมาเปรียบเทียบกันโดยตัวดำเนินการ === จะได้ผลลัพธ์เป็น false เพราะว่าตัวดำเนินการนี้ต้องเท่ากันทั้งข้อมูลและประเภทของตัวแปร

echo "x + y -> ", var_dump($x + $y);

ต่อมาเป็นการนำตัวแปรทั้งสองมาบวกกัน ซึ่งเป็นการบวกระหว่าง Integer กับ String ซึ่งในภาษา PHP ข้อมูลแบบ String นั้นมีลำดับความสำคัญน้อยกว่า Integer ทำให้ได้ผลลัพธ์สุดท้ายเป็น Integer

$male = true;
if ($male) {
    echo "You are a boy.\n";
} else {
    echo "You are a girl.\n";
}

echo "is_rain == male -> ", var_dump($is_rain == $male);
echo "is_rain === male -> ", var_dump($is_rain === $male);

ต่อมาเป็นการเปรียบเทียบค่าของ Integer ในบริบทของ Boolean เหมือนที่เราเคยบอกไปว่า True นั้นมีค่าเท่ากับ 1 ดังนั้นเมื่อใช้กับคำสั่ง If หรือเปรียบเทียบกันด้วยตัวดำเนินการ == จึงได้ผลลัพธ์เป็น true แต่ได้ผลลัพธ์เป็น false เมื่อทำการเปรียบเทียบความเท่ากันของประเภทของข้อมูลได้

x == y -> bool(true)
x === y -> bool(false)
x + y -> int(2)
It is raining now.
You are a boy.
is_rain == male -> bool(true)
is_rain === male -> bool(false)

และนี่เป็นผลลัพธ์เมื่อรันโปรแกรมในตัวอย่างข้างบน

Logical operators

ตัวดำเนินการตรรกศาสตร์ (Logical operators) คือตัวดำเนินการสำหรับสร้าง Expression จาก Expression ย่อยๆ โดยผลลัพธ์ที่ได้จะเป็น Boolean ที่มีค่า True หรือ False ต่อไปนี้เป็นตัวดำเนินการตรรกศาสตร์ในภาษา PHP

Operator Example  Result
and$expr1 and $expr2เป็นจริงถ้าหาก Expression ทั้งสองเป็นจริง ไม่เช่นนั้นเป็นเท็จ
or$expr1 or $expr2เป็นจริงถ้าหากอย่างน้อยหนึ่ง Expression เป็นจริง ไม่เช่นนั้นเป็นเท็จ
xor$expr1 xor $expr2เป็นจริงถ้าหาก Expression ทั้งสองมีค่าที่ต่างกัน ไม่เช่นนั้นเป็นเท็จ
notnot $expr1เป็นจริงถ้าหาก Expression เป็นเท็จ และเป็นเท็จถ้าหาก Expression เป็นจริง
&&$expr1 && $expr2เป็นจริงถ้าหาก Expression ทั้งสองเป็นจริง ไม่เช่นนั้นเป็นเท็จ (อีกรูปแบบของ and)
||$expr1 || $expr2เป็นจริงถ้าหากอย่างน้อยหนึ่ง Expression เป็นจริง ไม่เช่นนั้นเป็นเท็จ (อีกรูปแบบของ or)
!!$expr1เป็นจริงถ้าหาก Expression เป็นเท็จ และเป็นเท็จถ้าหาก Expression เป็นจริง (อีกรูปแบบของ not)

ในภาษา PHP คุณสามารถใช้ตัวดำเนินการตรรกศาสตร์รูปแบบใดก็ได้ เช่น and เป็นแบบประโยค และ && เป็นแบบสัญลักษณ์ซึ่งได้ผลลัพธ์เช่นเดียวกัน ซึ่งในบทเรียนนี้ส่วนมากแล้วเราจะใช้แบบสัญลักษณ์มากกว่า

<?php

$expr1 = (1 == 1); // true
$expr2 = (10 > 20); // false

$expr3 = $expr1 && $expr2; // false
$expr4 = $expr1 || $expr2; // true
$expr5 = !$expr4; // false

echo "expr1 = $expr1\n";
echo "expr2 = $expr2\n";
echo "expr3 = $expr3\n";
echo "expr4 = $expr4\n";
echo "expr5 = $expr5\n";

echo "expr1 = " , var_dump($expr1);
echo "expr2 = " , var_dump($expr2);
echo "expr3 = " , var_dump($expr3);
echo "expr4 = " , var_dump($expr4);
echo "expr5 = " , var_dump($expr5);

?>

ในตัวอย่าง เป็นการสร้าง Expression จากตัวดำเนินการตรรกศาสตร์แบบต่างๆ ในตอนแรกของโปรแกรมเรามีตัวแปร $expr1 สำหรับเก็บค่าการเท่ากับของ 1 และ 1 เนื่องจากทั้งสองค่าเท่ากัน ตัวแปรนี้จึงมีค่าเป็น true สำหรับตัวแปร $expr2 นั้น 10 ไม่มากกว่า 20 ดังนั้นจึงมีค่าเป็น false

$expr3 = $expr1 && $expr2; // false

ในตัวแปร $expr3 เป็นการรวมของสอง Expression เข้าด้วยกันด้วยตัวดำเนินการ and ใน $expr1 && $expr2 ซึ่งหมายความว่า "ถ้าหาก 1 เท่ากับหนึ่ง และ 10 มากกว่า 20" เนื่องจากนิพจน์ไม่เป็นจริงทำให้ $expr3 เป็น false

$expr4 = $expr1 || $expr2; // true

ในตัวแปร $expr4 เป็นการรวมของสอง Expression เข้าด้วยกันด้วยตัวดำเนินการ or ซึ่งหมายความว่า "ถ้าหาก 1 เท่ากับหนึ่ง หรือ 10 มากกว่า 20" เนื่องจากมีนิพจน์อย่างน้อยหนึ่งนิพจน์เป็นจริง $expr4 เป็น true

$expr5 = !$expr4; // false

ในคำสั่งนี้เป็นการใช้ตัวดำเนินการ not ในการกลับค่าของ Boolean ให้เป็นค่าตรงข้าม ซึ่งในตัวแปร $expr4 มีค่าเป็น true ผลลัพธ์ของตัวแปร $expr5 จึงเป็น false

expr1 = 1
expr2 =
expr3 =
expr4 = 1
expr5 =
expr1 = bool(true)
expr2 = bool(false)
expr3 = bool(false)
expr4 = bool(true)
expr5 = bool(false)

นี่เป็นผลลัพธ์การทำงานของโปรแกรม ซึ่งในภาษา PHP ค่า ฺBoolean ของ true จะถูกแสดงเป็น 1 และค่า false จะแสดงเป็น 0 หรือ String ที่ว่างปล่าวเหมือนที่คุณเห็นในผลลัพธ์ เราใช้ฟังก์ชัน var_dump() เพื่อแสดงประเภทและค่าที่แท้จริงของตัวแปร

ต่อไปมาดูตัวอย่างการประยุกต์ใช้งานตัวดำเนินการตรรกศาสตร์ในการเขียนโปรแกรม

<?php

define("ADMIN_USERNAME", "danny");
define("ADMIN_PASSWORD", "mat93qs6");

$username = "danny";
$password = "12345678";

if ($username == ADMIN_USERNAME && $password == ADMIN_PASSWORD) {
    echo "Login success.";  
} else {
    echo "Username or password is invalid.";
}

?>

ในตัวอย่าง เป็นโปรแกรมในการตรวจสอบการเข้าสู่ระบบของเว็บไซต์ ให้ตัวแปร $username และ $password เป็นค่าที่รับมาจากฟอร์ม ในการเข้าสู่ระบบทั้งชื่อผู้ใช้และรหัสผ่านต้องถูกต้อง ดังนั้นเราใช้ตัวดำเนินการ and (&&) สำหรับเงือนไขดังกล่าว

Username or password is invalid.

นี่เป็นผลลัพธ์เมื่อรันโปรแกรม ซึ่งจะพบว่าการเข้าสู่ระบบไม่สำเร็จ ถึงแม้ว่าชื่อผู้ใช้ถูกต้อง แต่รหัสผ่านนั้นไม่ถูกต้อง

ตัวอย่างต่อไปเป็นการใช้งานตัวดำเนินการ Or กับการตรวจสอบหลายเงือนไข

<?php

$name = "Marcus";
$age = 18;
$money = 120;

if ($age >= 20 || $money >= 100) {
    echo "$name can enter the party.";  
} else {
    echo "$name must have accept age or enough money.";
}

?>

ในตัวอย่างเป็นโปรแกรมตรวจสอบการเข้าปาร์ตี้ เพื่อเข้าร่วม Marcus จำเป็นต้องมีอายุตั้งแต่ 20 ปีขึ้นไป หรือมีเงินตั้งแต่ 100 เหรียญขึ้นไป

Marcus can enter the party.

นี่เป็นผลลัพธ์ของโปรแกรม ซึ่งในผลการทำงานนั้น Marcus สามารถเข้าร่วมปาร์ตี้ได้ เพราะถึงแม้เขาจะอายุไม่ถึง 20 ปี แต่เขามีเงินถึง 100 เหรียญ ซึ่งตัวดำเนินการ Or นั้นต้องการอย่างน้อยหนึ่ง Expression ที่จะเป็นจริง

String Concatenation Operator

ในภาษา PHP เครื่องหมายในการต่อ String คือจุด (.) ใช้สำหรับต่อ String ตั้งแต่สอง String ให้เป็น String เดียวกัน

$str = "marcus" . "code";

ในตัวอย่าง เป็นการใช้เครื่องหมายต่อ String สำหรับต่อสอง String เข้าด้วยกัน ซึ่งจะได้ String ใหม่ในตัวแปรเป็น "marcuscode" คุณสามารถเรียนรู้เกี่ยวกับ String ได้ในบทของ String

Ternary Operator

Ternary Operator คือตัวดำเนินการตรวจสอบเงื่อนไขแบบสั้น โดยตัวดำเนินการใช้เครื่องหมาย ? และมี Operand สามตัว ซึ่งมีรูปแบบการใช้งานดังนี้

expression ? value for true : value for false;

คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับ Ternary Operator ได้ในบทของคำสั่งเลือกเงื่อนไขของบทเรียนนี้

Operators precedence

ลำดับความสำคัญของตัวดำเนินการ (Operators precedence) คือการจัดลำดับการทำงานของตัวดำเนินการต่างๆ ในภาษา PHP โดยตัวดำเนินการที่มีลำดับความสำคัญมากที่สุดจะทำงานก่อนตัวดำเนินการที่มีลำดับความสำคัญน้อย ในตารางข้างล่าง เป็นลำดับความสำคัญของตัวดำเนินการที่เรียงจากความสำคัญมากที่สุดไปยังน้อยที่สุด

Associativity Operators
non-associative clone new
left [
right **
right ++ -- ~ (int) (float) (string) (array) (object) (bool) @
non-associative instance of
right !
left * / %
left + - .
left << >>
non-associative < <= > >=
non-associative == != === !== <> <=>
left &
left ^
left |
left &&
left ||
right ??
left ?:
right = += -= *= **= /= .= %= &= |= ^= <<= >>=
left and
left xor
left or

คุณสามารถกำหนดความสำคัญให้กับตัวดำเนินการหรือกลุ่มของ Expression ได้โดยการใส่เครื่องหมายวงเล็บ () ล้อมรอบ มาดูตัวอย่างการทำงานของลำดับความสำคัญของตัวดำเนินการในภาษา PHP

<?php

$a = 2 + 3 * 5;
echo "a = $a\n";

$b = (2 + 3) * 5;
echo "b = $b\n";

?>

ในตัวอย่างในตัวแปร $a จะได้ค่าเป็น 17 เพราะว่าเครื่องหมายการคูณ * มีลำดับความสำคัญมากกว่าการบวก ดังนั้นการทำงานจึงเป็นการนำ 3 คูณกับ 5 ก่อน แล้วค่อยนำผลลัพธ์ไปบวกกับ 2 ซึ่งเป็นการทำงานตามปกติ

ต่อมาในตัวแปร $b เราบังคับให้โปรแกรมทำการบวกเลขก่อนโดยการใส่เครื่องหมายวงเล็บ () ทำให้การทำงานเป็นการบวกเลขก่อนแล้วนำผลลัพธ์ไปคูณกับ 5 ซึ่งจะได้ผลลัพธ์เป็น 25

a = 17
b = 25

นี่เป็นผลลัพธ์ของโปรแกรม

ในบทนี้ คุณได้เรียนรู้ตัวดำเนินการประเภทต่างๆ ทั้งตัวดำเนินการเปรียบเทียบที่ใช้สำหรับเปรียบเทียบเพื่อสร้างเงื่อนไข ตัวดำเนินการตรรกศาสตร์สำหรับสร้าง Expression จาก Expression ย่อยๆ และลำดับความสำคัญของตัวดำเนินการในภาษา PHP

บทความนี้เป็นประโยชน์หรือไม่? Yes · No