介紹 PHP 中運算子的用法,包含執行運算子 (Execution Operator)、增值 / 減值運算子 (Incrementing / Decrementing Operator)、邏輯運算子 (Logical Operator)、字串運算子 (String Operator)、陣列運算子 (Array Operator) 和型別運算子 (Type Operator)。

執行運算子

執行運算子 (Execution Operator) 使用兩個倒斜點 (```) 包夾要執行的指令,注意它並不是單引號,他會將執行結果的輸出回傳,可以存到變數。

1
2
3
4
5
6
7
8
9
// 在 Linux 系統列出檔案
$output = `ls al`;
// 在 Windows 系統列出檔案
$output = `DIR /A`;
echo "<pre>{$output}</pre>";

// 利用變數作為參數的用法
$param = "/A"; // 傳入的參數
$output = `DIR {$param}`;

執行運算子必須在 php.ini 設定的 safe_mode 關閉的情況下才使用。另外也可使用 shell_exec() 函式來達到相同的功能:

1
2
3
4
5
6
7
// 在 Linux 系統列出檔案
$param = "al"; // 傳入的參數
$output = shell_exec("ls {$param}");
// 在 Windows 系統列出檔案
$param = "/A"; // 傳入的參數
$output = shell_exec("DIR {$param}");
echo "<pre>{$output}</pre>";

增值 / 減值運算子

增值 / 減值運算子 (Incrementing / Decrementing Operator) 包含以下四種:

範例名稱說明
++$a前置增值$a 先 +1,再回傳
$a++後置增值$a 先回傳,再 +1
–$a前置減值$a 先 -1,再回傳
$a–後置減值$a 先回傳,再 -1

一些範例如下:

1
2
3
4
5
6
7
8
9
$a = 5;
var_dump(++$a); // int(6)
var_dump($a); // int(6)
var_dump($a++); // int(6)
var_dump($a); // int(7)
var_dump(--$a); // int(6)
var_dump($a); // int(6)
var_dump($a--); // int(6)
var_dump($a); // int(5)

增值 / 減值運算子也可以使用在字元上,不過他的變化是類似 Perl 而不是 C,例如:’Z’ + 1 會變成 ‘AA’ 而不 ‘Z’ 的下一個字元。

1
2
3
4
$a = 'W';
for ($i = 0; $i < 6; $i++) {
var_dump(++$a);
}

結果:

1
2
3
4
5
6
string(1) "X"
string(1) "Y"
string(1) "Z"
string(2) "AA"
string(2) "AB"
string(2) "AC"

增值 / 減值運算子對其他型別沒有效果,除了 NULL 型別做增值運算時會變成 1。

1
2
var_dump(--$a);  // NULL, 減值仍是 NULL
var_dump(++$a); // int(1), 增值才有作用

另外前置會比後置的效能好,例如:++$i 會比 $i++ 的效能好。

邏輯運算子

邏輯運算子 (Logical Operator) 將判斷結果以布林回傳,包含以下運算子:

範例名稱說明
$a and $b且 (And)$a 和 $b 都為TRUE時回傳 TRUE
$a or $b或 (Or)$a 或 $b 任一為TRUE時回傳 TRUE
$a xor $b互斥 (Xor)$a 和 $b 只有其中一方為 TRUE 時回傳 TRUE
! $a非 (Not)$a 不為 TRUE 時回傳 TRUE
$a && $b且 (And)$a 和 $b 都為 TRUE 時回傳 TRUE
$a || $b或 (Or)$a 或 $b 任一為 TRUE 時回傳 TRUE

And 和 Or 有兩種運算子,但他們的優先順序不同。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function trueFunc() {
echo "trueFunc";
return true;
}

function falseFunc() {
echo "falseFunc";
return false;
}

// 當判斷前面的部份能決定結果時, 就不會執行後面的部份
var_dump(false && trueFunc()); // bool(false), 不會執行到 trueFunc()
var_dump(true || falseFunc()); // bool(true), 不會執行到 falseFunc()

var_dump(false && trueFunc() || falseFunc()); // bool(false), 會執行到 falseFunc()
var_dump(false AND trueFunc() || falseFunc()); // bool(false), 不會執行到 trueFunc() 和 falseFunc(), 因為這相當於 false AND (trueFunc() || falseFunc())

// 相當於: ($a = (false || true))
$a = false || true; // $a: true

// 相當於: (($b = false) or true)
$b = false or true; // $b: false, or 不會影響到 $b 的值, && 和 and 同理

// or 一種常用的用法
$c = falseFunc() or error_log("執行失敗");

$fp = fopen("nofile.php", "r") or die("找不到檔案");
echo "不會到這";

字串運算子

字串運算子 (String Operator) 使用 (.) 符號,回傳左右兩邊字串結合的結果。能與指派運算子並用 (.=),效果為將字串附加在變數後面。另外,與數字運算時會轉成字串處理:

1
2
3
4
5
6
7
8
9
$a = "Hello ";
$b = $a . "World!"; // $b: Hello World!

$a = "Hello ";
$a .= "World!"; // $a: Hello World!

var_dump("one is " . 1); // string(8) "one is 1"
var_dump(169.99); // float(169.99)
var_dump(169 . 99); // string(5) "16999"

陣列運算子

陣列運算子 (Array Operator) 包含以下運算子:

範例名稱說明
$a + $b聯集$a 和 $b 的聯集
$a == $b相等$a 和 $b 有相同的 Key 和 Value 時為 TRUE
$a === $b完全相等$a 和 $b 有相同的 Key 和 Value 且型別和順序皆相同時為 TRUE
$a != $b不相等$a 和 $b 沒有相同的 Key 和 Value 時為 TRUE
$a <> $b不相等$a 和 $b 沒有相同的 Key 和 Value 時為 TRUE
$a !== $b不完全相等$a 和 $b 沒有相同的 Key 和 Value 或型別或順序不相同時為 TRUE

當聯集出現相同 Key 不同值的時候,以前面的內容為主:

1
2
3
4
5
6
7
8
9
10
11
12
13
$a = array("dindin" => "紫色", "lala" => "黃色");
$b = array("dindin" => "好色", "banana" => "黃色");
print_r($a + $b); // Array ( [dindin] => 紫色 [lala] => 黃色 [banana] => 黃色 )
print_r($b + $a); // Array ( [dindin] => 好色 [banana] => 黃色 [lala] => 黃色 )

$c = array("a" => 55, "b" => 66);
$d = array("a" => "55", "b" => "66");
$e = array("b" => 66, "a" => 55);
var_dump($c == $d); // bool(true)
var_dump($c === $d); // bool(false)

var_dump($c == $e); // bool(true)
var_dump($c === $e); // bool(false)

當陣列為數字索引要做陣列結合時,使用聯集的效果可能不是你想要的,可以使用 array_merge() 函式:

1
2
3
4
$a = array("dindin", "lala");
$b = array("dindin", "banana", "fool");
print_r($a + $b); // Array ( [0] => dindin [1] => lala [2] => fool )
print_r(array_merge($a, $b)); // Array ( [0] => dindin [1] => lala [2] => dindin [3] => banana [4] => fool )

型別運算子

型別運算子 (Type Operator) 使用 (instanceof) 關鍵字,可以用來判斷一個變數是否為某一種類別,並將結果以布林回傳。變數如果繼承自某個類別或實作於某個介面 (Interface),判斷結果會回傳TRUE;另外也可使用另一個物件或字串來判斷:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class ParentClass {}
class MyClass extends ParentClass {}
interface FoolInterface {}
class LaLaClass implements FoolInterface {}

$a = new MyClass;
$b = new LaLaClass;

var_dump($a instanceof MyClass); // bool(true)
var_dump(!($a instanceof MyClass)); // bool(false), 使用 (!) 判斷不是某個類別
var_dump($a instanceof LaLaClass); // bool(false)
var_dump($a instanceof ParentClass); // bool(true)
var_dump($a instanceof NoClass); // bool(false), 不存在的類別回傳 false

var_dump($b instanceof LaLaClass); // bool(true)
var_dump($b instanceof FoolInterface); // bool(true)

$c = new MyClass;
$d = 'MyClass';

var_dump($a instanceof $c); // bool(true), 相同類別
var_dump($a instanceof $d); // bool(true)

除了使用 instanceof 外,也可使用 is_a() 函式來做判斷:

1
2
3
4
5
class MyClass {}

$a = new MyClass;

var_dump(is_a($a, 'MyClass')); // bool(true)

延伸閱讀

上一篇 PHP 教學 - 運算子 (Operators) - 上