測試環境 PHP version 5.3.29/5.6.29/7.1.0 Apache 2.4.25
運算符是可以通過給出的一或多個值(表達式)來產生另一個值(因而整個結構成為一個表達式)的東西。
PHP中運算符包括如下內容:
運算符優先級 算術運算符 賦值運算符 位運算符 比較運算符 錯誤控制運算符 執行運算符 遞增/遞減運算符 邏輯運算符 字符串運算符 數組運算符 類型運算符PHP中運算符優先級請參考:運算符優先級
注意:邏輯運算符的兩套符號優先級不同,優先級從高到低依次為:&& > || > = > and > xor > or
除法運算符總是返回浮點數。只有兩個操作數都是整數(或字符串轉換成的整數)并且正好能整除時返回一個整數;
取模運算符的操作數在運算之前都會轉換成整數(向下取整,除去小數部分);
取模運算符 % 的結果和被除數的符號相同,即$a % $b
的結果和 $a 的符號相同;
PHP 5.6 新增冪運算符,等同于pow()函數;
<?php $a=3; $b=4; echo $a**$b; //PHP 5.6 新增冪運算符?>取模運算符%
只在integer數據范圍內有效,對較大的數進行取模運算的時候最好使用fmod()
函數代替取模運算符%
;
PHP先計算組合運算符右側的值,最后再用左側的變量和右側表達式的結果進行計算; 和javascript計算結果不同。
<?php $a = 0; $a -= (++$a) + (++$a); echo $a; //outputs: -1,右側計算結果為3,此時$a為2,最后結果是2-3=-1?><script> var a = 0; a -= (++a) + (++a); alert(a); //alert: -3,等效于a=a-((++a)+(++a));</script>位移在 PHP 中是數學運算。向任何方向移出去的位都被丟棄。左移時右側以零填充,符號位被移走意味著正負號不被保留。右移時左側以符號位填充,意味著正負號被保留。
如果位運算符&,|,^
兩側都是string類型的,則按照ASCII碼值進行計算,返回的結果也是string類型,其他情況下則會強制轉化成整型,結果必然也是整型。
如果位運算符 ~
是string類型的,則按照ASCII碼值進行計算,返回的結果也是string類型,其他情況下則會強制轉化成整型,結果必然也是整型。
位運算符<<,>>
總是被轉換成整型計算。
字符串類型的位運算
<?phpif (('18' & '32') == '10') { //ord()返回字符串第一個字符的ASCII echo ord('18'); //return 十進制 49, 數字1的二進制為 110001 echo ord('32'); //return 十進制 51, 數字3的二進制為 110011 echo ord('10'); //return 十進制 49, 數字1的二進制為 110001 //因此 110001 & 110011 = 110001}?>如果比較一個數字和字符串或者比較涉及到數字內容的字符串,則字符串會被轉換為數值并且比較按照數值來進行。
PHP 7.0 新增以下兩個比較運算符:
結合比較運算符$a<=>$b
,當$a
小于、等于、大于 $b
時,分別返回一個小于、等于、大于0的integer 值; NULL 合并操作符 ??
,返回從左往右第一個存在且不為 NULL 的操作數,如果都沒有定義且不為 NULL,則返回 NULL。 <?php $foo = null; $bar = null; $baz = 1; $qux = 2; echo $foo ?? $bar ?? $baz ?? $qux; // outputs 1?> 三目運算符可以省略第二個表達式。表達式expr1 ?: expr3
在 expr1 求值為 TRUE 時返回 expr1,否則返回 expr3,同時報 ERR_NOTICE
錯誤。
比較常用的寫法是(isset($var) && $var) ? $var : 'default_value'
,如果忽略Notice錯誤,則可簡寫成 @($var?:'default_value')
;
三目運算符表達式和字符串拼接的時候請小心,因為運算符優先級的問題,將會產生意想不到的結果,建議將表達式用圓括號()
括起來。
建議使用!$var=='str'
代替$var != 'str'
做判斷,在PHP 7.1.0上測試運行時間如下:
當使用比較運算符(==)比較兩個對象變量時,比較的原則是:如果兩個對象的屬性和屬性值都相等,而且兩個對象是同一個類的實例,那么這兩個對象變量相等。
而如果使用全等運算符(===),這兩個對象變量一定要指向某個類的同一個實例(即同一個對象)。
<?PHP class A { private $value; function __construct ($value) { $this->value = $value; } } class B { private $value; function __construct ($value) { $this->value = $value; } } $a1 = new A (1); $a2 = new A (2); $b1 = new B (1); var_dump( $a1 == $a2 ); //bool(false) var_dump( $a1 == $b1 ); //bool(false)?>數組與數組的比較,具有較少成員的數組較小,如果運算數 1 中的鍵不存在于運算數 2 中則數組無法比較,否則挨個值比較。
<?php $var_a = array(1 => 1, 2 => 0, 3 => 1); $var_b = array(1 => 1, 3 => 0, 2 => 1); if(1){ //此處代碼無法解釋??? //($var_a > $var_b,$var_a < $var_b,$var_a != $var_b)均為true var_dump($var_a > $var_b); // bool(true) var_dump($var_b > $var_a); // bool(true) var_dump($var_b == $var_a); // bool(false) echo "<br/>"; //($var_c > $var_d ,$var_c < $var_d ,$var_c==$var_d)均為false $var_c = array(1 => 1, 2 => 1, 3 => 0); $var_d = array(1 => 1, 3 => 1, 2 => 0); var_dump($var_c > $var_d); // bool(false) var_dump($var_d > $var_c); // bool(false) var_dump($var_d == $var_c); // bool(false) echo "<br/>"; } $var_e = array(1 => 1, 2 => 0, 3 => 1); $var_f = array(1 => 1, 2 => 1, 3 => 0); var_dump($var_e > $var_f); // bool(false) var_dump($var_f > $var_e); // bool(true) var_dump($var_e == $var_f); // bool(false) echo "<br/>";?>當將@
放置在一個 PHP 表達式之前,該表達式可能產生的任何錯誤信息都被忽略掉。
運算符只對表達式有效。簡單的規則就是:如果能從某處得到值,就能在它前面加上 @ 運算符。
謹慎使用 @
,它會降低代碼執行速度,它是代碼執行速度與便捷的妥協,代碼在PHP 5.3.29 版本上測試結果如下:
PHP 支持一個執行運算符:反引號(``
),PHP 將嘗試將反引號中的內容作為 shell 命令來執行,并將其輸出信息返回。
反引號不能在雙引號字符串中使用。
字符變量的遞增/遞減運算時,字符變量只能遞增,不能遞減,并且只支持純字母(a-z 和 A-Z)。遞增/遞減其他字符變量則無效,原字符串沒有變化。
字符變量只能遞增,不能遞減。
<?php $s = 'W'; for ($n=0; $n<10; $n++) { echo ++$s . ' '; //X Y Z AA AB AC AD AE AF AG } echo "<br/>"; for ($n=10; $n>0; $n--) { echo (--$s) . ' ';//AG AG AG AG AG AG AG AG AG AG }?>字符串里有字符’E’且后面緊跟著數字,則會被當成科學計數法,此時字符串的遞增、遞減運算會轉換成數字運算。
<?php $a="9D9"; var_dump(++$a); // string(3) "9E0" $a="9E2"; var_dump(++$a); // float(901)?>“與”和”或”有兩種不同形式運算符(&& / and
與|| / or
)的原因是它們運算的優先級不同,如果不記得優先級,建議給表達式加上圓括號()
,防止出現意想不到的結果。
數組運算符包括聯合、全等、相等、不全等、不等運算操作。
+
運算符把右邊的數組元素附加到左邊的數組后面,如果兩個數組中有相同的鍵名,則只用左邊數組中的,右邊的被忽略。
再次強調,數組中的 +
是聯合的意思,并不是將數組中的每一個元素相加。
instanceof
用于確定一個對象是否屬于某一類的實例;
instanceof
也可用來確定一個對象是不是繼承自某一父類的子類的實例;
instanceof
也可用于確定一個對象是不是實現了某個接口對象的實例;
新聞熱點
疑難解答
圖片精選