每種編程語言都有運算符,運算符要學會靈活使用。php
運算符擁有不一樣的優先級和結合方向。shell
<?php var_dump(1 <= 1 == 1); // true var_dump(true ? 0 : true ? 1 : 2); // 2 $a = 1; var_dump(++$a + $a++); // may print 4 or 5
在須要的時候使用括號,能夠加強代碼的可讀性。編程
取模運算符的結果和被除數的符號相同。數組
賦值運算符將原變量的值拷貝到新變量中,有個例外就是碰到對象時,是以引用賦值的,除非明確使用clone
關鍵字來拷貝。安全
new運算符自動返回一個引用。app
位移有一下幾個規律:編程語言
向任何方向移出去的位都被丟棄。函數
左移時以零填充,且正負號不被保留。code
右移時以符號位填充,意味着正負號保留。對象
這一節的重點就是把手冊重點的幾個示例程序看懂吧。示例中字符串的XOR運算比較難理解,這個之後再看。還有整數的位移,感受理解就好吧。
普通等號==
只需類型轉換後兩值相等就返回真。
若是比較一個數字和字符串或者比較涉及到數字內容的字符串,則字符串會被轉換爲數值而且比較按照數值來進行。
<?php var_dump(0 == "a"); // true var_dump("1" == "01"); // true var_dump("10" == "1e1"); // true
自PHP 5.3起,能夠省略三元運算符中間那部分。表達式expr1 ?: expr3
在expr1真時返回expr1,不然返回expr3。三元運算符是從左往右計算的。
PHP支持一個錯誤控制運算符@,@運算符只對表達式有效。將其放在表達式前,該表達式可能產生的任何錯誤信息都被忽略掉。
不能把它放在函數或類的定義以前,也不能用於條件結構例如if和foreach等。
PHP支持一個執行運算符:反引號,就是鍵盤左上角那個。效果與函數shell_exec()
相同。
<?php $output = `systeminfo`; $outip = shell_exec('ipconfig'); echo "<pre>$outip</pre>"; echo "<pre>$output</pre>";
反引號運算符在激活了安全模式或者關閉了shell_exec()
時是無效的。
注意!反引號不能在雙引號字符串中使用。
遞增/遞減運算符不影響布爾值。
遞減NULL值也沒有效果,可是遞增NULL的結果是1。
在處理字符變量的算術運算時,PHP沿襲了Perl的習慣,而非C的。例如,在Perl中$a = 'Z'; $a++;
將把$a變成'AA'。
注意!字符變量只能遞增,不能遞減,而且只支持純字母(a-z和A-Z)。遞增/遞減其餘字符字符變量則無效,原字符串沒有變化。
<?php $z = 'z'; $Z = 'Z'; var_dump(++$z); // 'aa' var_dump(++$Z); // 'AA'
||
比or
的優先級高。&&
比and
的優先級高。
第一個是鏈接運算符.
,第二個是鏈接賦值運算符.=
。
聯合:$a + $b
。把右邊的數組元素附加到左邊的數組後面,兩個數組中都有的鍵名,則只用左邊數組中的,有變更額被忽略。
相等:$a == $b
。具備相同的鍵值對。
全等:$a === $b
。具備相同的鍵值對,而且順序和類型都相同。
不等:$a != $b
或$a <> $b
。
不全等:$a !== $b
。
數組中的單元若是具備相同的鍵名和值則比較時相等,不要在乎順序和類型。
<?php $a = array("apple", "banana"); $b = array(1 => "banana", "0" => "apple"); var_dump($a); var_dump($b); var_dump($a == $b); var_dump($a === $b);
輸出結果以下所示。
array (size=2) 0 => string 'apple' (length=5) 1 => string 'banana' (length=6) array (size=2) 1 => string 'banana' (length=6) 0 => string 'apple' (length=5) boolean true boolean false
PHP中有一個類型運算符instanceof
,用於肯定一個PHP變量是否屬於某一類的實例。
<?php class MyParent {} class MyClass extends MyParent {} class NotMyClass {} interface MyInterface {} class InClass implements MyInterface {} $a = new MyClass; var_dump($a instanceof MyClass); // true var_dump($a instanceof NotMyClass); // false var_dump($a instanceof MyParent); // true $b = new InClass; var_dump($b instanceof MyInterface); // true $c = 'InClass'; var_dump($b instanceof $c); // true var_dump($c instanceof stdClass); // false
注意,instanceof
不容許用來檢測常量。
(全文完)