PHP8:PHP的運算子

傑克.陳發表於2014-12-03
原文:PHP 8: PHP的運算子

本章將介紹PHP的運算子。
運算子這個問題在每種語言裡都有,因為我們已經熟悉了程式語言裡的一種或是多種,所以只需要瞭解一下就行了。
概括一下吧。
PHP運算子有很多種,看樣子要比C/C++,C#等語言多多了。分別是:

  • 算術運算子
  • 賦值運算子
  • 位運算子
  • 比較運算子
  • 錯誤控制運算子
  • 執行運算子
  • 遞增/遞減運算子
  • 邏輯運算子
  • 字串運算子
  • 陣列運算子
  • 型別運算子

這也是蠻多的,五花八門的。

算術運算子

例子

名稱

結果

-$a

取反

$a 的負值。

$a + $b

加法

$a $b 的和。

$a – $b

減法

$a $b 的差。

$a * $b

乘法

$a $b 的積。

$a / $b

除法

$a 除以 $b 的商。

$a % $b

取模

$a 除以 $b 的餘數。

位運算子

例子

名稱

結果

$a & $b

And(按位與)

將把 $a $b 中都為 1 的位設為 1

$a | $b

Or(按位或)

將把 $a 或者 $b 中為 1 的位設為 1

$a ^ $b

Xor(按位異或)

將把 $a $b 中不同的位設為 1

~ $a

Not(按位非)

$a 中為 0 的位設為 1,反之亦然。

$a << $b

Shift left(左移)

$a 中的位向左移動
$b
次(每一次移動都表示乘以 2”)。

$a >> $b

Shift right(右移)

$a 中的位向右移動
$b
次(每一次移動都表示除以 2”)。

比較運算子

例子

名稱

結果

$a == $b

等於

TRUE,如果 $a 等於 $b

$a === $b

全等

TRUE,如果 $a 等於 $b,並且它們的型別也相同。(PHP 4 引進)

$a != $b

不等

TRUE,如果 $a 不等於 $b

$a <> $b

不等

TRUE,如果 $a 不等於 $b

$a !== $b

非全等

TRUE,如果 $a 不等於 $b,或者它們的型別不同。(PHP 4 引進)

$a < $b

小與

TRUE,如果 $a 嚴格小於 $b

$a > $b

大於

TRUE,如果 $a 嚴格 $b

$a <= $b

小於等於

TRUE,如果 $a 小於或者等於 $b

$a >= $b

大於等於

TRUE,如果 $a 大於或者等於 $b

遞增/遞減運算子

例子

名稱

效果

++$a

前加

$a 的值加一,然後返回 $a

$a++

後加

返回 $a,然後將 $a 的值加一。

–$a

前減

$a 的值減一, 然後返回 $a

$a–

後減

返回 $a,然後將 $a 的值減一。

邏輯運算子

例子

名稱

結果

$a and $b

And(邏輯與)

TRUE,如果 $a $b 都為 TRUE

$a or $b

Or(邏輯或)

TRUE,如果 $a $b 任一為 TRUE

$a xor $b

Xor(邏輯異或)

TRUE,如果 $a $b 任一為 TRUE,但不同時是。

! $a

Not(邏輯非)

TRUE,如果 $a 不為 TRUE

$a && $b

And(邏輯與)

TRUE,如果 $a $b 都為 TRUE

$a || $b

Or(邏輯或)

TRUE,如果 $a $b 任一為 TRUE

陣列運算子

例子

名稱

結果

$a + $b

聯合

$a $b 的聯合。

$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

當然還有幾種型別的沒有列出,將在後面描述。我們先看看列出的吧。
如果沒有對上面的運算子做特殊說明,那麼說明它們和C#裡的相似。

  • 首先看看位運算裡的左移(<<)或右移(>>),其實沒有什麼不同,只是符號不一樣而已。
  • 看看比較運演算法裡的“==”,“===”,這兩個比較有意思,它們有什麼區別呢?

            看看一下程式碼:             

 1 <?php
 2 var_dump(0 == a); // 0 == 0 -> true
 3 var_dump(1 == 01); // 1 == 1 -> true
 4 
 5 switch (a) {
 6 case 0:
 7    echo 0;
 8    break;
 9 case a: // never reached because “a” is already matched with 0
10    echo a;
11    break;
12 }

         看第2行,為什麼0會等於“a”呢?奇怪了。之所以會相等,是因為在PHP裡,如果整型和字串比較時,字串會自動的轉化為數值。這裡就會有一個問題:字串轉化為數值的原則是什麼?原則是

                 1)如果包括“.”,“e”或“E”其中任何一個字元的話,字串被當作
float 來求值。否則就被當作整數。

                2)該值由字串最前面的部分決定。如果字串以合法的數字資料開始,就用該數字作為其值,否則其值為
0(零)。合法數字資料由可選的正負號開始,後面跟著一個或多個數字(可選地包括十進位制分數),後面跟著可選的指數。指數是一個“e”或者“E”後面跟著一個或多個數字。例如:

 1 <?php
 2 $var = 1 + 10.5;                
 3 echo 1 + 10.5=.$var.; type:.gettype($var).<Br>;
 4 $var = 1 + -1.3e3;              
 5 echo 1 + 1.3e3=.$var.; type:.gettype($var).<Br>;
 6 $var = 1 + bob-1.3e3;          
 7 echo 1 + bob1.3e3=.$var.; type:.gettype($var).<Br>;
 8 $var = 1 + bob3;                
 9 echo 1 + bob3=.$var.; type:.gettype($var).<Br>;
10 $var = 1 + 10 beatiful birds;      
11 echo 1 + 10 beatiful birds=.$var.; type:.gettype($var).<Br>;
12 $var= 4 + 10.2 Little Apple
13 echo 4 + 10.2 Little Apple=.$var.; type:.gettype($var).<Br>;
14 $var = 10.0 pigs  + 1;          
15 echo 10.0 pigs  + 1=.$var.; type:.gettype($var).<Br>;
16 $var = 10.0 pigs  + 1.0;        
17 echo  10.0 pigs  + 1.0=.$var.; type:.gettype($var).<Br>;
18 ?> 
19 

輸出的結果是:

1 + 10.5=11.5; type:double
1 + -1.3e3=-1299; type:double
1 + bob-1.3e3=1; type:integer
1 + bob3=1; type:integer
1 + 10 beatiful birds=11; type:integer
4 + 10.2 Little Apple=14.2; type:double
10.0 pigs  + 1=11; type:double
10.0 pigs  + 1.0=11; type:double

現在明白是怎麼回事了吧。為什麼“a”為0就是這個道理。
既然如此,還有一個“===”,3個等於符號,它表示不僅最後轉化的數值相等,而且型別也應該相等。看看下面的程式碼:

1 <?php
2  var_dump(0 === a); // 0 === 0 -> false
3  echo `<br>`;
4  var_dump(0 === 00); // 0 === “00” -> false
5  echo `<br>`;
6  var_dump(0 === 0); // 0 === 0 -> true
7  echo `<br>`;
8 ?>

輸出結果為:

bool(false)
bool(
false)
bool(
true

第6行之所以為true,是因為它們不僅數值相等,而且型別也一樣。
   3)看看邏輯運算,“或”和“與”居然有2種寫法,如果你使用C/C++,C#,Java等語言的話,就用“&&”或”||”吧。如果你是VB的話,就用and,和or。當然你也可以2種都用。它們有什麼區別呢?優先順序的不同而已。”&&“與”||”比”and“和”or“優先順序要高。
  4).PHP多了一個陣列運算子。有了上面的解釋,相信它們不是很難了。

  • 賦值運算子

           和C#語言一樣,也是利用”=“,也是利用二元符號賦值。例如:

<?php
 
$a=`hello`//$a是hello。
 $a+=1;      //$a是1,二元賦值符
 $b=`world`;
 
$c=`hello`;
 
$c.=$b;//$c是”hello world”
?>

  • 錯誤執行運算子

       PHP 支援一個錯誤控制運算子:@。當將其放置在一個 PHP
表示式之前,該表示式可能產生的任何錯誤資訊都被忽略掉。

     如果啟用了 track_errors
特性,表示式所產生的任何錯誤資訊都被存放在變數
$php_errormsg
中。此變數在每次出錯時都會被覆蓋,所以如果想用它的話就要儘早檢查。例如:

<?php
/* Intentional file error */
$my_file = @file (`non_existent_file`) or
   
die (Failed opening file: error was `$php_errormsg`);

// this works for any expression, not just functions:
$value = @$cache[$key];
// will not issue a notice if the index $key doesn`t exist.

?> 

 

  • 執行運算子

       PHP 支援一個執行運算子:反引號(“)。注意這不是單引號!PHP 將嘗試將反引號中的內容作為外殼命令來執行,並將其輸出資訊返回(例如,可以賦給一個變數而不是簡單地丟棄到標準輸出)。使用反引號運算子“`”的效果與函式 shell_exec() 相同。反引號位於鍵盤的”~“鍵那裡。例如:

1 <?php
2  $out=`dir c:`;
3  echo `<pre>`.$out.`</pre>`;
4 ?>

結果為:

 Volume in drive C has no label.
 Volume Serial 
Number is A0197D77

 Directory of C

:

02/24/2006  10:21 PM  Downloads
02/24/2006 10:09 PM Kingsoft Temp Download
05/13/2006 07:07 PM 220 cmd.txt
02/13/2006 11:40 PM WINDOWS
02/13/2006 11:47 PM Documents and Settings
02/13/2006 11:57 PM Program Files
06
/24/2006 11:01 PM 482,933 nfzmLog.log
05
/11/2006 10:28 PM  Inetpub
05
/13/2006 07:07 PM 4 response.txt
07/29/2006 05:56 PM 0 Rec.pcm
06/24/2006 09:05 PM nf
07/29/2006 05:56 PM 0 WriteAudrv.wav
07/04/2006 08:52 PM dwnSetup
07/08/2006 09:28 AM TEMP
02/14/2006 12:15 AM NVIDIA
5 File(s) 483,157 bytes 10 Dir(s) 2,116,558,848 bytes free 
  • 遞增/遞減運算子

    PHP 支援 C 風格的前/後遞增與遞減運算子。

    注:
    遞增/遞減運算子不影響布林值。遞減
    NULL 值也沒有效果,但是遞增 NULL 的結果是 1。

     遞增/遞減運算子

    例子 名稱 效果
    ++$a 前加 $a 的值加一,然後返回 $a。
    $a++ 後加 返回 $a,然後將 $a 的值加一。
    –$a 前減 $a 的值減一, 然後返回 $a。
    $a– 後減 返回 $a,然後將 $a 的值減
  • 型別運算子

    PHP 有一個型別運算子:instanceof。instanceof
    用來測定一個給定的物件是否來自指定的物件類。

    instanceof 運算子是 PHP 5 引進的。在此之前用
    is_a(),但是
    is_a() 已經過時了,最好用 instanceof。

          C#裡是is,而Java是instanceof,和PHP一樣。例如:

 1 <?php
 2 class A { }
 3 class B { }
 4 
 5 $thing = new A;
 6 
 7 if ($thing instanceof A) {
 8     echo `A`;
 9 }
10 if ($thing instanceof B) {
11     echo `B`;
12 }
13 ?>

  • 字元運算子

有兩個字串運算子。第一個是連線運算子(“.”),它返回其左右引數連線後的字串。第二個是連線賦值運算子(“.=”),它將右邊引數附加到左邊的引數後。這些在前面已經見到,就不舉例了。


相關文章