ข้ามไปเนื้อหา

ภาษาพีเอชพี/ตัวดำเนินการ

จาก วิกิตำรา

ตัวดำเนินการมีอยู่หลายประเภท โดยหลักจะแบ่งโดย จำนวนส่วนประกอบ มี 3 ประเภท คือ

  1. unary operator (ประกอบด้วยหนึ่งส่วน เช่น ++ -- !)
  2. binary operator (ประกอบด้วยสองส่วน เช่น + - * / =)
  3. ternary operator (ประกอบด้วยสามส่วน เช่น ?:)

และยังมีการแบ่งชนิดตามหน้าที่การทำงานด้วย

ระดับความสำคัญ

[แก้ไข | แก้ไขต้นฉบับ]

Operator แต่ละตัวมีความสำคัญต่างกัน ตัวไหนมีความสำคัญมากกว่าจะถูกใช้ก่อน

  • โดยถ้า operator ที่มีความสำคัญเท่ากัน ก็จะขึ้นอยู่กับ รูปแบบการประเมิน ว่ามีทิศทางไปทางไหน
การประเมิน Operator
ไม่มี clone new
ซ้ายไปขวา [
ไม่มี ++ --
ไม่มี ~ - (int) (float) (string) (array) (object) (bool) @
ไม่มี instanceof
ขวาไปซ้าย !
ซ้ายไปขวา * / %
ซ้ายไปขวา + - .
ซ้ายไปขวา << >>
ไม่มี < <= > >= <>
ไม่มี == != === !==
ซ้ายไปขวา &
ซ้ายไปขวา ^
ซ้ายไปขวา |
ซ้ายไปขวา &&
ซ้ายไปขวา ||
ซ้ายไปขวา ? :
ขวาไปซ้าย = ^= <<= >>=
ซ้ายไปขวา and
ซ้ายไปขวา xor
ซ้ายไปขวา or
ซ้ายไปขวา ,

ตัวอย่างของรูปแบบการประเมิน

<?php
$a = 10 * 3 / 6; // จะเท่ากับ (10*3) / 6

$a = 1;
$b = 2;
$a = $b += 2; // $a = ($b += 2) --> $a = 4, $b = 4
?>

Arithmetic Operators หรือ ตัวดำเนินการทางคณิตศาสตร์ ลักษณะการใช้งานก็คล้ายกับรูปแบบคณิตศาสตร์ทั่วไป

Operator ตัวอย่าง ผลลัพธ์
+ (บวก) $a + $b ผลรวมของ $a และ $b
- (ลบ) $a - $b ผลต่างของ $a และ $b
* (คูณ) $a * $b ผลคูณของ $a และ $b
/ (หาร) $a / $b ผลหารของ $a และ $b
% (หารเอาเศษ) $a % $b เศษ จากการหารของ $a และ $b
- -$a กลับค่า $a

Assignment Operators หรือ ตัวดำเนินการกำหนดค่า คือ operator ที่ใช้ในการกำหนดค่า

Operator ตัวอย่าง ผลลัพธ์
= $a = $b กำหนดค่า $a เท่ากับ $b
+= $a += $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 $a = $a . $b (String Operator)
&= $a &= $b $a = $a & $b (Bitwise Operator)
|= $a |= $b $a = $a | $b (Bitwise Operator)
^= $a ^= $b $a = $a ^ $b (Bitwise Operator)
<<= $a <<= $b $a = $a << $b (Bitwise Operator)
>>= $a >>= $b $a = $a >> $b (Bitwise Operator)
<?php
$a = 3;
$b = 2;
$a += $b;
echo $a; // Output: 5
?>

Bitwise Operators หรือ ตัวดำเนินการทางบิท คือ operator ที่เกี่ยวข้องกับข้อมูลในระดับ bit

  • โดย bit ที่มีค่าเป็น 0 เรียกว่า clear มีค่าเป็น 1 เรียกว่า set
Operator ตัวอย่าง ผลลัพธ์
&(and) $a & $b bit set ถ้า bit ของทั้ง $a และ $b set
|(or) $a | $b bit set ถ้า bit ของ $a หรือ $b set
^(xor) $a ^ $b bit set ถ้า bit ของ $a หรือ $b set แต่ถ้า set ทั้งคู่จะเป็น clear
~(not) ~ $a ถ้า bit นั้น set จะเป็น clear กลับกันถ้าเป็น clear จะเป็น set
<< $a << $b เลื่อน(shift) บิทของ $a ไปทางซ้ายจำนวน $b ครั้ง
>> $a >> $b เลื่อน(shift) บิทของ $a ไปทางขวาจำนวน $b ครั้ง

ตัวอย่างของการ and, or, xor แบบ bitwise

Bitwise AND
( 0 = 0000) & ( 5 = 0101) = ( 0 = 0000)
( 1 = 0001) & ( 5 = 0101) = ( 1 = 0001)
( 2 = 0010) & ( 5 = 0101) = ( 0 = 0000)
( 4 = 0100) & ( 5 = 0101) = ( 4 = 0100)
( 8 = 1000) & ( 5 = 0101) = ( 0 = 0000)
Bitwise Inclusive OR
( 0 = 0000) | ( 5 = 0101) = ( 5 = 0101)
( 1 = 0001) | ( 5 = 0101) = ( 5 = 0101)
( 2 = 0010) | ( 5 = 0101) = ( 7 = 0111)
( 4 = 0100) | ( 5 = 0101) = ( 5 = 0101)
( 8 = 1000) | ( 5 = 0101) = (13 = 1101)
Bitwise Exclusive OR (XOR)
( 0 = 0000) ^ ( 5 = 0101) = ( 5 = 0101)
( 1 = 0001) ^ ( 5 = 0101) = ( 4 = 0100)
( 2 = 0010) ^ ( 5 = 0101) = ( 7 = 0111)
( 4 = 0100) ^ ( 5 = 0101) = ( 1 = 0001)
( 8 = 1000) ^ ( 5 = 0101) = (13 = 1101)

ตัวอย่างการใช้งานใน PHP

<?php
echo 4 ^ 5; // Output: 1
echo 4 | 5; // Output: 5
echo 4 & 5; // Output: 4
?>

ตาราง AND

Bit-1 Bit-2 ผลลัพธ์
1 1 1
0 1 0
1 0 0
0 0 0

ตาราง OR

Bit-1 Bit-2 ผลลัพธ์
1 1 1
0 1 1
1 0 1
0 0 0

ตาราง XOR

Bit-1 Bit-2 ผลลัพธ์
1 1 0
0 1 1
1 0 1
0 0 0

ตัวอย่างข้างล่างจะเป็นอธิบาย การ shift bit ทั้งซ้ายและขวา

--- Shift bit ของ จำนวนเต็มบวก ไปทางขวา --- 
4 >> 1 = 2
 Binary:
  ค่าเริ่มต้น=0000 0100
  ผลลัพธ์=0000 0010

4 >> 2 = 1
 Binary:
  ค่าเริ่มต้น=0000 0100
  ผลลัพธ์=0000 0001

 4 >> 3 = 0
 Binary:
  ค่าเริ่มต้น=0000 0100
  ผลลัพธ์=0000 0000

--- Shift bit ของ จำนวนเต็มบวก ไปทางซ้าย --- 
4 << 1 = 8
 Binary:
  ค่าเริ่มต้น=0000 0100
  ผลลัพธ์=0000 1000

4 << 2 = 16
 Binary:
  ค่าเริ่มต้น=0000 0100
  ผลลัพธ์=0001 0000

 4 << 3 = 0
 Binary:
  ค่าเริ่มต้น=0000 0100
  ผลลัพธ์=0010 0000

4 << 6 = -128
 Binary:
  ค่าเริ่มต้น=0000 0100
  ผลลัพธ์=1000 0000
**เนื่องจากเลื่อนบิทไปเปลี่ยนค่าของ sign-bit ซึ่งเป็นตัวบอกเครื่องหมายของจำนวนเต็ม
--- Shift bit ของ จำนวนเต็มลบ ไปทางขวา --- 
-4 >> 1 = -2
 Binary:
  ค่าเริ่มต้น=1111 1100
  ผลลัพธ์=1111 1110
**เป็น 1 เพราะเอา sign-bit มาเติม bit

-4 >> 2 = -1
 Binary:
  ค่าเริ่มต้น=1111 1100
  ผลลัพธ์=1111 1111

 -4 >> 3 = -1
 Binary:
  ค่าเริ่มต้น=1111 1100
  ผลลัพธ์=1111 1111

--- Shift bit ของ จำนวนเต็มลบ ไปทางขวา --- 
-4 << 1 = -8
 Binary:
  ค่าเริ่มต้น=1111 1100
  ผลลัพธ์=1111 1000

-4 << 2 = -16
 Binary:
  ค่าเริ่มต้น=1111 1100
  ผลลัพธ์=1111 0000

 -4 << 3 = -32
 Binary:
  ค่าเริ่มต้น=1111 1100
  ผลลัพธ์=1110 0000

 -4 << 6 = 0
 Binary:
  ค่าเริ่มต้น=1111 1100
  ผลลัพธ์=0000 0000
**sign-bit หลุดออกไปด้วย

Comparison Operators หรือ ตัวดำเนินการเปรียบเทียบ เป็น operator ที่ใช้เปรียบเทียบค่า 2 ค่า

Operator ตัวอย่าง ผลลัพธ์
== $a == $b TRUE ถ้า $a เท่ากับ $b
=== $a === $b TRUE ถ้า $a เท่ากับ $b และเป็น ชนิด เดียวกัน
!= $a != $b TRUE ถ้า $a ไม่เท่ากับ $b
<> $a <> $b TRUE ถ้า $a ไม่เท่ากับ $b
!== $a !== $b TRUE ถ้า $a ไม่เท่ากับ $b และเป็นคนละ ชนิด กัน
< $a < $b TRUE ถ้า $a น้อยกว่า $b
> $a > $b TRUE ถ้า $a มากกว่า $b
<= $a <= $b TRUE ถ้า $a น้อยกว่าหรือเท่ากับ $b
>= $a >= $b TRUE ถ้า $a มากกว่าหรือเท่ากับ $b

อาจจะใช้ร่วมกับ Logical Operator ด้วย

<?php
$a = 1;
$b = 2
$c = false;

if( ($a == $b) && $c ) 
{ echo "TRUE"; }
else
{ echo "FALSE"; }
// Output: FALSE 
// เพราะว่า $c เป็น false
?>

และยังมี ternary operator อีกตัวคือ (? :) รูปแบบการใช้งานคือ

  • (expr1) ? (expr2) : (expr3) คือถ้า expr1 มีค่า TRUE จะเลือกใช้ expr2 แต่ถ้า expr1 เป็น FALSE จะเลือก expr3
<?php
$a = false;
$b = ($a) ? "foo" : "bar";
echo $b; // Output: bar
// ซับซ้อนมากขึ้น
$c = ($b == "foo") ? 1 : ($b == "world") ? 2 : ($b == "bar") ? 3 : 0; // $c : 3
echo $c; // Output: 3
?>

จะพบว่ามีลักษณะเหมือน if-statement นั้นเอง

Error Control Operators

Execution Operators

Incrementing และ Decrementing Operators

[แก้ไข | แก้ไขต้นฉบับ]

Incrementing/Decrementing Operators หรือ ตัวดำเนินการเพิ่มลด มี 4 ตัว 2 รูปแบบคือ ไว้ข้างหน้ากับไว้ข้างหลัง ซึ่งผลลัพธ์ที่ได้ต่างกัน

Operator ตัวอย่าง ผลลัพธ์
++ ++$a เพิ่มค่าของ $a แล้วค่อยคืนค่า $a
-- --$a ลดค่าของ $a แล้วค่อยคืนค่า $a
++ $a++ คืนค่า $a ก่อนแล้วค่อยเพิ่มค่า $a
-- $a-- คืนค่า $a ก่อนแล้วค่อยลดค่า $a
<?php
$a = 1;

echo $a++; // Output: 1
echo $a; // Output: 2

echo ++$a; // Output: 3
$b = --$a; // $b : 2, $a: 2
$c = $a--; // $c : 2, $a: 1
?>

Logical Operators หรือ ตัวดำเนินการทางตรรกะ

Operator ตัวอย่าง ผลลัพธ์
and $a and $b TRUE ถ้า $a และ $b มีเท่ากับ TRUE
or $a or $b TRUE ถ้า $a หรือ $b มีค่าเท่ากับ TRUE
xor $a xor $b TRUE ถ้า $a หรือ $b มีค่าเท่ากับ TRUE แต่ถ้าเป็น TRUE ทั้งคู่ค่าจะได้ FALSE
! ! $a TRUE ถ้า $a มีค่าไม่เท่ากับ TRUE
&& $a && $b TRUE ถ้า $a และ $b มีเท่ากับ TRUE
|| $a || $b TRUE ถ้า $a หรือ $b มีค่าเท่ากับ TRUE

ตัวอย่าง

<?php
$a = (true || false || false); // $a = true; --> $a = ((true || false) || false );
$a = (true || true && false); // $a = false --> $a = ( true || (true && false));
$a = true;
!$a; // $a : false
!$a; // $a : true

//credit: momrom@freenet.de ที่ยกตัวอย่างเพิ่มความกระจ่างใน manual online
// "||" มีระดับความสำคัญสูงกว่า "=" ซึ่งมีระดับความสำคัญสูงกว่า "or"
$e = false || true; // $e จะกำหนดค่าเป็น (false || true) ซึ่งก็จะเป็น true
$f = false or true; // $f จะกำหนดค่าเป็น false เพราะว่า "=" มีระดับสำคัญสูงกว่า "or"
var_dump($e, $f);

// "&&" มีระดับความสำคัญสูงกว่า "=" ซึ่งมีระดับความสำคัญสูงกว่า "and"
$g = true && false; // $g จะกำหนดค่าเป็น (true && false) ซึ่งจะเป็น false
$h = true and false; // $h จะกำหนดค่าเป็น true เพราะว่า "=" มีระดับสำคัญสูงกว่า "and"
var_dump($g, $h);

?>

สำหรับคนที่งงในเรื่อง or and xor ตารางนี้จะช่วยอธิบายได้ดีขึ้น

ตาราง AND

P Q ผลลัพธ์
TRUE TRUE TRUE
FALSE TRUE FALSE
TRUE FALSE FALSE
FALSE FALSE FALSE

ตาราง OR

P Q ผลลัพธ์
TRUE TRUE TRUE
FALSE TRUE TRUE
TRUE FALSE TRUE
FALSE FALSE FALSE

ตาราง XOR

P Q ผลลัพธ์
TRUE TRUE FALSE
FALSE TRUE TRUE
TRUE FALSE TRUE
FALSE FALSE FALSE

String Operators มีอยู่ 2 ตัวคือ

  1. .
  2. .=

ซึ่งทำหน้าที่ในการเชื่อม string 2 ตัวเข้าด้วยกัน

<?php
$a = "Foo";
$b = "Bar";
$c = $a . $b; // $c : "FooBar"

$c .= "World"; // มีค่าเท่ากับ $c = $c . "World";

echo $c; // Output: FooBarWorld
?>

Array Operators

Operator ตัวอย่าง ผลลัพธ์
+ $a + $b ยูเนี่ยน $a และ $b
== $a == $b TRUE ถ้า $a และ $b มีค่า key/value ทุกคู่เท่ากัน
=== $a === $b TRUE ถ้า $a และ $b มีค่า key/value ทุกคู่เท่ากัน และ เรียงเหมือนกัน ชนิดเดียวกัน
!= $a != $b TRUE ถ้า $a และ $b ไม่เท่ากัน
<> $a <> $b TRUE ถ้า $a และ $b ไม่เท่ากัน
!== $a !== $b TRUE ถ้า $a และ $b ไม่เท่ากัน เรียงไม่เหมือนกัน คนละชนิดกัน

โดย operator + (ยูเนี่ยน) จะเอา element ของ arrayด้านขวามือ ไปเพิ่มใส่ arrayด้านซ้ายมือ ถ้าหากว่า key ซ้ำกันก็จะ ไม่เกิดการเขียนทับ

<?php
$a = array("a" => "apple", "b" => "banana");
$b = array("a" => "pear", "b" => "strawberry", "c" => "cherry");

$c = $a + $b; // Union of $a and $b
echo "Union of \$a and \$b: \n";
var_dump($c);

$c = $b + $a; // Union of $b and $a
echo "Union of \$b and \$a: \n";
var_dump($c);
?>

Output:

Union of $a and $b:
array(3) {
 ["a"]=>
 string(5) "apple"
 ["b"]=>
 string(6) "banana"
 ["c"]=>
  string(6) "cherry"
}
Union of $b and $a:
array(3) {
 ["a"]=>
 string(4) "pear"
 ["b"]=>
 string(10) "strawberry"
 ["c"]=>
 string(6) "cherry"
}

การเทียบ element 1 คู่นั้น จะถือว่าเท่ากันได้ก็ต่อเมื่อ key และ value นั้นเท่ากัน

<?php
$a = array("apple", "banana");
$b = array(1 => "banana", 0 => "apple");

var_dump($a == $b); // bool(true)
var_dump($a === $b); // bool(false) - เนื่องจากเรียงต่างกัน
?>

Type Operators