国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

PHP填坑——運(yùn)算符

2019-11-08 03:01:57
字體:
供稿:網(wǎng)友

php填坑——運(yùn)算符

測試環(huán)境 PHP version 5.3.29/5.6.29/7.1.0 Apache 2.4.25

運(yùn)算符

運(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)算符

運(yùn)算符優(yōu)先級

PHP中運(yùn)算符優(yōu)先級請參考:運(yùn)算符優(yōu)先級

Example-1

注意:邏輯運(yùn)算符的兩套符號優(yōu)先級不同,優(yōu)先級從高到低依次為:&& > || > = > and > xor > or

<?php $bool = true && false; var_dump($bool); // false $bool = true and false; var_dump($bool); // true?>

算術(shù)運(yùn)算符

除法運(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 的符號相同;

Example-1

PHP 5.6 新增冪運(yùn)算符,等同于pow()函數(shù);

<?php $a=3; $b=4; echo $a**$b; //PHP 5.6 新增冪運(yùn)算符?>

Example-2

取模運(yùn)算符%只在integer數(shù)據(jù)范圍內(nèi)有效,對較大的數(shù)進(jìn)行取模運(yùn)算的時(shí)候最好使用fmod()函數(shù)代替取模運(yùn)算符%

<?php echo 3333333333 % 3,'<br/>'; //PRints -1 echo fmod(3333333333 ,3); //prints 0 ?>

賦值運(yùn)算符

Example-1

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>

位運(yùn)算符

位移在 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ì)算。

Example-1

字符串類型的位運(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}?>

比較運(yùn)算符

如果比較一個(gè)數(shù)字和字符串或者比較涉及到數(shù)字內(nèi)容的字符串,則字符串會被轉(zhuǎn)換為數(shù)值并且比較按照數(shù)值來進(jìn)行。

Example-1

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?>

Example-2

三目運(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');

<?php $a = array(); $a['foo'] = 'oof'; $b = @($a['foo'] ?: 'No foo'); $c = @($a['bar'] ?: 'No bar'); echo $b.PHP_EOL.$c; //outputs: oof No bar?>

Example-3

三目運(yùn)算符表達(dá)式和字符串拼接的時(shí)候請小心,因?yàn)檫\(yùn)算符優(yōu)先級的問題,將會產(chǎn)生意想不到的結(jié)果,建議將表達(dá)式用圓括號()括起來。

<?php echo "a string that has a " . (true) ? 'true' : 'false' . "condition in."; //echo true?>

Example-4

建議使用!$var=='str'代替$var != 'str'做判斷,在PHP 7.1.0上測試運(yùn)行時(shí)間如下:

<?php for($bench = 0; $bench < 3; $bench++) { $start = microtime(true); $a = 1; $b = 0; for($i = 0; $i < 100000000; $i++) { if(!$a == 'hello') { $b++; } } $end = microtime(true); echo "Used time: " . ($end-$start) . "<br/>/n"; } /** * $a != 'hello' * Used time: 8.529669046402 * Used time: 8.1041309833527 * Used time: 8.2515349388123 * * !$a == 'hello' * Used time: 5.8349351882935 * Used time: 5.6691370010376 * Used time: 5.6830477714539 */?>

Example-5

當(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)?>

Example-6

數(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/>";?>

錯(cuò)誤控制運(yùn)算符

當(dāng)將@放置在一個(gè) PHP 表達(dá)式之前,該表達(dá)式可能產(chǎn)生的任何錯(cuò)誤信息都被忽略掉。

運(yùn)算符只對表達(dá)式有效。簡單的規(guī)則就是:如果能從某處得到值,就能在它前面加上 @ 運(yùn)算符。

Example-1

謹(jǐn)慎使用 @ ,它會降低代碼執(zhí)行速度,它是代碼執(zhí)行速度與便捷的妥協(xié),代碼在PHP 5.3.29 版本上測試結(jié)果如下:

<?php $start =microtime(true); function x() { } for ($i = 0; $i < 1000000; $i++) { @x(); } $end = microtime(true); echo "Used time: " . ($end-$start) . "<br/>/n"; /** * without @ * Used time: 0.16029000282288 * with @ * Used time: 0.7277979850769 */?>

執(zhí)行運(yùn)算符

PHP 支持一個(gè)執(zhí)行運(yùn)算符:反引號(``),PHP 將嘗試將反引號中的內(nèi)容作為 shell 命令來執(zhí)行,并將其輸出信息返回。

反引號不能在雙引號字符串中使用。

Example-1

<?php header('content-type:text/html;charset=gbk'); $host = 'www.baidu.com'; echo `ping -n 3 {$host} /n`;?>

遞增/遞減運(yùn)算符

字符變量的遞增/遞減運(yùn)算時(shí),字符變量只能遞增,不能遞減,并且只支持純字母(a-z 和 A-Z)。遞增/遞減其他字符變量則無效,原字符串沒有變化。

Example-1

字符變量只能遞增,不能遞減。

<?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 }?>

Example-2

字符串里有字符’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)算符

“與”和”或”有兩種不同形式運(yùn)算符(&& / and|| / or)的原因是它們運(yùn)算的優(yōu)先級不同,如果不記得優(yōu)先級,建議給表達(dá)式加上圓括號(),防止出現(xiàn)意想不到的結(jié)果。

Example-1

<?php $e = false || true; $f = false or true;// false 被賦給 $f,true 被忽略,等價(jià)于(($f = false) or true) var_dump($e, $f);?>

字符串運(yùn)算符

數(shù)組運(yùn)算符

數(shù)組運(yùn)算符包括聯(lián)合、全等、相等、不全等、不等運(yùn)算操作。

Example-1

+運(yùn)算符把右邊的數(shù)組元素附加到左邊的數(shù)組后面,如果兩個(gè)數(shù)組中有相同的鍵名,則只用左邊數(shù)組中的,右邊的被忽略。

<?php $a = array("a" => "apple", "b" => "banana"); $b = array("a" => "pear", "b" => "strawberry", "c" => "cherry"); echo "<pre>"; $c = $a + $b; // Union of $a and $b var_dump($c); $c = $b + $a; // Union of $b and $a var_dump($c); $a += $b; // Union of $a += $b is $a and $b var_dump($a);?>

Example-2

再次強(qiáng)調(diào),數(shù)組中的 + 是聯(lián)合的意思,并不是將數(shù)組中的每一個(gè)元素相加。

<?php $a = array(1,2,3); $b = array(4,5,6,7,8); $c = $a + $b; // Union of $a and $b print_r($c); //Array ([0] => 1 [1] => 2 [2] => 3 [3] => 7 [4] => 8)?>

類型運(yùn)算符

instanceof 用于確定一個(gè)對象是否屬于某一的實(shí)例;

instanceof 也可用來確定一個(gè)對象是不是繼承自某一父類的子類的實(shí)例;

instanceof 也可用于確定一個(gè)對象是不是實(shí)現(xiàn)了某個(gè)接口對象的實(shí)例;

Example-1

<?php class MyClass1{ } interface MyInterface{ } class MyClass2 implements MyInterface{ } $a = new MyClass1; $b = new MyClass2; var_dump(!$a instanceof stdClass); //bool(true) var_dump($b instanceof MyClass2); //bool(true) var_dump($b instanceof MyInterface); //bool(true)?>

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 思茅市| 济宁市| 桓台县| 忻城县| 封开县| 鹿邑县| 海晏县| 古交市| 新乡市| 辽阳县| 佛坪县| 丹东市| 绥中县| 赞皇县| 穆棱市| 淮安市| 鄂托克旗| 兴隆县| 乳山市| 唐海县| 荔浦县| 托克托县| 绥德县| 陈巴尔虎旗| 卢湾区| 台湾省| 确山县| 永顺县| 屯昌县| 大新县| 元氏县| 久治县| 尉犁县| 峨眉山市| 南汇区| 永仁县| 定安县| 婺源县| 湖州市| 辽阳县| 斗六市|