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