官术网_书友最值得收藏!

3.4 表達(dá)式和操作符

表達(dá)式是PHP語言最重要的概念。任何有值的式子那是一個PHP表達(dá)式。

最基本的表達(dá)式形式是常量和變量。用操作符連接常量和變量構(gòu)成的式子是表達(dá)式的常見形式。

例如:

          defi ne("PI",3.14);
          $a=1000;
          $b=$a;
          $c=PI;
          $d=($a+$b);

稍復(fù)雜的表達(dá)式是函數(shù)以及包含函數(shù)的運算式。

例如:

          function five()
          {
          return 5;
          }
          $e=five();   //變量$e的值等于函數(shù)five()的返回值5
          $f=$e+fi ve();//變量$f的值等于10

書寫表達(dá)式時,需要注意以下幾點:

1 按照人們的一般運算邏輯和思維方式書寫。

2 以易于理解為第一追求,有利效率為第二追求。

3 必要時加上注釋。

操作符也叫運算符,是具有特定運算意義的標(biāo)準(zhǔn)運算符號,利用它可以就給出的一或多個表達(dá)式來產(chǎn)生另一個新值。比如,“+”代表數(shù)學(xué)意義上的求和運算,“*”代表數(shù)學(xué)意義上的求積運算,等等。

PHP語言有三種類型的運算符:第一類是一元運算符,只對一個操作數(shù)運算,例如!(取反運算符,邏輯非)或++(加1運算符)。第二類是有限二元運算符,PHP中的大多數(shù)運算符屬于此類。第三類是三元運算符。只有?:一個。它實際上相當(dāng)于一個兩分支判斷程序,使用時應(yīng)該把整個三元表達(dá)式放到括號()里,以利于理解其返回值。

當(dāng)表達(dá)式中有多個運算符時,就涉及優(yōu)先級問題。比如:表達(dá)式2+2*2的值是6,而不是8。是因為運算符*的優(yōu)先級高于運算符+,所以2+2*2相當(dāng)于2+4,而不是4*2。

如果運算符優(yōu)先級相同,則按照從左到右的順序依次運算。

在PHP中有很多運算符,當(dāng)構(gòu)成表達(dá)式的運算符比較多,我們不易理清其運算順序時,建議使用括號()來強制運算的優(yōu)先順序,而不必刻意追求表達(dá)式的書寫格式,這樣可以增強代碼的可讀性。

除了運算符的優(yōu)先級之外,還有運算符的結(jié)合方向需要考慮,主要是二元運算符。它們分為左結(jié)合運算符和右結(jié)合運算符。通俗地講,就是從運算符左邊的表達(dá)式向右邊的表達(dá)式結(jié)合進行運算就屬

          $a=500/100; //運算符"/"左邊的500為被除數(shù),右邊的100為除數(shù),$a的值為5
          $a+=100;   //運算符"+="右邊的100向左運算,加到$a上,故結(jié)果是$a=105

PHP語言中操作符的結(jié)合性和運算優(yōu)先級如表3-4所示。

表3-4 操作符的優(yōu)先級和結(jié)合性

PHP語言的操作符可以分為算術(shù)運算符、賦值運算符、位運算符、比較運算符、遞增遞減運算符、邏輯運算符、字符串運算符、數(shù)組運算符、類型運算符、錯誤控制運算符和執(zhí)行運算符。

3.4.1 算術(shù)運算符

包括+、-、*、/、%共5個,分別對應(yīng)算術(shù)中的加、減、乘、除、取模運算。主要注意的是除號/返回結(jié)果總是浮點數(shù),即使兩個運算數(shù)是整數(shù)也是這樣。取模運算較為復(fù)雜,當(dāng)兩個操作數(shù)都是正數(shù)時結(jié)果為正,如果有一個操作數(shù)為負(fù),那么余數(shù)的符號則取決于機器,比如21%-5,結(jié)果可能為-1或1。如果有兩個操作數(shù)都是負(fù)數(shù),應(yīng)該是得出結(jié)果為負(fù)數(shù)。

3.4.2 賦值運算符

基本的賦值運算符是=。它的含義并不是“等于”。它意味著把右邊表達(dá)式的值賦給左邊的運算數(shù)或變量。

例如:

            $a=100+100;  //含義是把=號右邊的表達(dá)式100+100的值(等于200)賦值給變量$a

賦值運算表達(dá)式的值也就是所被賦的值。也就是說,賦值表達(dá)式$a=100的值是100。

例如:

            $a=($b=100)+100; //結(jié)果是變量$b的值為100,變量$a的值為200

賦值運算是將=號右邊的值復(fù)制到=左邊的新變量中,屬于傳值賦值。

3.4.3 位運算符

包括&、|、^、~、<<、>>共6個。分別對應(yīng)與、或、異或、非、左移、右移運算。

位運算符是對整型數(shù)中指定的位進行置位。如果左右參數(shù)都是字符串,則位運算符將操作字符的ASCII值。

位運算符實際上是對操作數(shù)換算成二進制表示形式,對其二進制位進行的操作。

位運算符的運算意義如表3-5所示。

表3-5 位運算符的運算意義

例如:

        echo 12^9;  //顯示輸出的結(jié)果為5

十進制數(shù)12的二進制表示是1100,9的二進制表示是1001,根據(jù)異或運算的“相同為0,不同為1”規(guī)則,結(jié)果為0101,即十進制數(shù)5。

需要注意的是,在32位系統(tǒng)上不要右移超過32位,也不要在結(jié)果可能超過32位的情況下左移。以上兩種情況會使位“溢出”,運算結(jié)果出錯。

3.4.4 比較運算符

顧名思義,比較運算符是對兩個值進行比較而得到返回值。包括==、===、!=、<>、!==、<、>、<=、>=、?:共10個運算符。

比較運算符的運算意義如表3-6所示。

表3-6 比較運算符的運算意義

三元條件運算符?:稍微特殊,它的基本使用格式是(expr1) ? (expr2) : (expr3),在expr1求值為TRUE時,三元條件運算符?:構(gòu)成的整個表達(dá)式的值為expr2,在expr1求值為FALSE時整個表達(dá)式的值為expr3。

            例如:
            $a=1?2:3;   //此時$a的值為2
            $b=0?2:3;   //此時$b的值為3
            $c=($a>$b)?2:3;   //此時$c的值為3,因為expr1(即$a>$b)求值為FALSE。
            $d=($a<$b)?2:3;   //此時$d的值為2,因為expr1(即$a<$b)求值為TRUE。

如果比較一個整數(shù)和字符串,則字符串會被轉(zhuǎn)換為整數(shù)。如果比較兩個數(shù)字字符串,則作為整數(shù)比較。

對于多種的數(shù)據(jù)類型,比較運算符根據(jù)表3-7進行比較。

表3-7 比較多種類型

3.4.5遞增遞減運算符

PHP語言支持C語言風(fēng)格的前、后遞增與遞減運算符。遞增遞減運算符的運算意義如表3-8所示。

表3-8 遞增遞減運算符的運算意義

            例如:
            $a=1;
            $b=$a++;  //$b的值為1,$a的值為2
            $b=++$a;  //$a的值為3,$b的值為3

注意:

遞增遞減運算符不影響布爾類型變量的值。遞減NULL值也沒有效果,但是遞增NULL的結(jié)果是1

在處理字符變量的算術(shù)運算時,PHP沿襲了Perl的習(xí)慣,而非C的。例如,在Perl中 'Z'+1將得到'AA',而在C中,'Z'+1將得到'['(ord('Z') == 90,ord('[') == 91)。注意字符變量只能遞增,不能遞減。

例如:

          $i = 'W';
          for ($n=0; $n<6; $n++) {
              echo ++$i . "\n";
          }
    將輸出:
    X
    Y
    Z
    AA
    AB
    AC

3.4.6 邏輯運算符

包括and、or、xor、!、&&、||共6個,分別對應(yīng)與、或、異或、非、與、或邏輯運算。“與”和“或”有兩種不同形式運算符,它們運算的優(yōu)先級不同,見表3-3。

邏輯運算符的運算意義如表3-9所示。

表3-9 邏輯運算符的運算意義

3.4.7 字符串運算符

包括.、.=共兩個。第一個.稱為連接運算符,第二個.=稱為連接賦值運算符。其作用都是將兩個字符串連接成一個字符串。

例如:

            $a="Hello ";
            $b=$a."World!";   //字符串變量$b的內(nèi)容為"Hello World!"
            $a="Hello ";
            $a.="World!";     //字符串變量$a的內(nèi)容為"Hello World!"

3.4.8 數(shù)組運算符

包括+、==、===、!=、<>、!==共6個,數(shù)組運算符的運算意義如表3-10所示。

表3-10 數(shù)組運算符的運算意義

+運算符執(zhí)行兩個數(shù)組的聯(lián)合運算,就是把右邊的數(shù)組附加到左邊的數(shù)組后面,但是重復(fù)的鍵值不會被覆蓋。

例如:

          $a=array("a"=>"Tom", "b"=>"Jerry");
          $b=array("a"=>"Mary", "b"=>"Yao", "c"=>"apple");
          $c=$a+$b;  // $a和$b的聯(lián)合
          echo "Union of \$a and \$b: \n";
        ar_dump($c); //此函數(shù)通過縮進顯示數(shù)組的結(jié)構(gòu)信息,
        如果是多維數(shù)組將遞歸展開類型與值。
            $c=$b+$a; // $b和$a的聯(lián)合
            echo "Union of \$b and \$a: \n";
            var_dump($c);

上述代碼將顯示:

            Union of $a and $b:
            array(3) {
              ["a"]=>
              string(3) "Tom"
              ["b"]=>
              string(5) "Jerry"
              ["c"]=>
              string(5) "apple"
            }
            Union of $b and $a:
            array(3) {
              ["a"]=>
              string(4) "Mary"
              ["b"]=>
              string(3) "Yao"
              ["c"]=>
              string(5) "apple"
            }

3.4.9 類型運算符

類型運算符:instanceof。instanceof用來測定一個給定的對象是否來自指定的對象類。instanceof運算符是PHP5引進的。

例如:

              class A { }
              class B { }  //定義了兩個類A、B
              $thing=new A;  //聲明類A的一個對象$thing
              if ($thing instanceof A) {
                  echo 'A';
              }
              if ($thing instanceof B) {
                  echo 'B';
              }
              輸出:
              A

3.4.10 錯誤控制運算符

錯誤控制運算符只有1個:@。當(dāng)將其放置在一個PHP表達(dá)式之前,該表達(dá)式可能產(chǎn)生的任何錯誤信息都被忽略掉。

例如:

    $c=@mysql_connect(); //此處參數(shù)省略,將使用默認(rèn)參數(shù)

上面的語句是使用函數(shù)mysql_connect()建立了一個MySQL數(shù)據(jù)庫連接,但是連接失敗將不會提示任何出錯信息。

3.4.11 執(zhí)行運算符

``,反引號,數(shù)字鍵1左邊鍵的字符。反引號中的內(nèi)容將作為操作系統(tǒng)命令來執(zhí)行,并將其輸出信息賦值給一個變量。

例如:

            $out_OS=`ipconfig /all`;
            echo $out_OS;

輸出結(jié)果為本機網(wǎng)絡(luò)連接的詳細(xì)配置信息。

主站蜘蛛池模板: 高平市| 克东县| 车险| 福鼎市| 精河县| 龙陵县| 拜城县| 公安县| 宜川县| 都安| 盘锦市| 神木县| 山东省| 陆丰市| 永登县| 无极县| 克山县| 信阳市| 会泽县| 禹州市| 青河县| 康马县| 定陶县| 红原县| 鸡泽县| 绥棱县| 峨山| 洞口县| 基隆市| 安泽县| 青阳县| 邵阳市| 博湖县| 阳曲县| 台安县| 定远县| 江阴市| 卢氏县| 孝感市| 阳谷县| 曲阜市|