PHP教學 - 運算子(Operators) - 下

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

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

1
2
3
4
5
6
7
8
9
10
11
<?php
// 在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
8
9
<?php
// 在Linux系統列出檔案
$param = "al"// 傳入的參數
$output = shell_exec("ls {$param}");
// 在Windows系統列出檔案
$param = "/A"// 傳入的參數
$output = shell_exec("DIR {$param}");
echo "<pre>{$output}</pre>";
?>
9. 增值/減值運算子
增值/減值運算子(Incrementing/Decrementing Operator)包含以下四種:
範例名稱說明
++$a 前置增值 $a先+1,再回傳
$a++ 後置增值 $a先回傳,再+1
--$a 前置減值 $a先-1,再回傳
$a-- 後置減值 $a先回傳,再-1
一些範例如下:

1
2
3
4
5
6
7
8
9
10
11
<?php
$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
5
<?php
$a = 'W';
for($i=0;$i<6;$i++)
  var_dump(++$a);
?>
結果:
string(1) "X"
string(1) "Y"
string(1) "Z"
string(2) "AA"
string(2) "AB"
string(2) "AC"
增值/減值運算子對其他型別沒有效果,除了NULL型別做增值運算時會變成1。

1
2
3
4
<?php
var_dump(--$a);  // NULL, 減值仍是NULL
var_dump(++$a);  // int(1), 增值才有作用
?>
另外前置會比後置的效能好,例如:++$i會比$i++的效能好。
10. 邏輯運算子
邏輯運算子(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
29
30
<?php
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 "不會到這";
?>
11. 字串運算子
字串運算子(String Operator)使用(.)符號,回傳左右兩邊字串結合的結果。能與指派運算子並用(.=),效果為將字串附加在變數後面。另外,與數字運算時會轉成字串處理:

1
2
3
4
5
6
7
8
9
10
11
<?php
$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"
?>
12. 陣列運算子
陣列運算子(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
14
15
<?php
$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
5
6
<?php
$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 )
?>
13. 型別運算子
型別運算子(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
23
24
<?php
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
6
7
<?php
class MyClass {}
$a = new MyClass;
var_dump(is_a($a, 'MyClass')); // bool(true)
?>

留言

這個網誌中的熱門文章

c語言-關於#define用法

PHP教學 - 資料型態(Data Type) - 上

CMD常用網管指令