PHP開發基礎(1):PHP 點運算子(.)與資料類型轉換的深入探討

來源:互聯網
上載者:User

    如果估計沒錯,在 PHP 語言中,使用最多的運算子號當數點運算子號“.”,使用最多的語句當數“echo”。不難理解,PHP 的目標就是產生超文本指令碼,而超文本指令碼就是由字串組成的,所以 PHP 處理最多的資料當是字串,因此連接字串的點運算子和輸出字串的語句“echo”就被經常用到。

    最常用的不一定是最熟悉的。當我們敲擊 echo "...."; 語句輸出運算結果的時候,有誰敢說自己已經對字串、點符號了如指掌、運用自如了呢?

    比如,語句 echo '100'; 和 echo 100; 輸出的 html 代碼結果都是 100,他們有什麼不同?
    再比如,語句 echo 100.200; 和 echo 100[空格].[空格]200; 輸出結果一樣嗎?為什嗎?
    ……

    1,瞭解 PHP 是一門“弱類型”的語言

    每門電腦語言(我知道的將近20門語言中),都是有資料類型的,PHP 概莫能外。“弱類型”的語言不是說該語言沒有資料類型,而是說它弱化或不強調資料類型,具體的說,就是變數在使用前不必聲明資料類型,類型根據所賦值的類型來決定,同時也定義了變數本身。但 PHP 的函數和各種操作符(運算子)又是有變數和運算元類型要求的。所以,不可避免的,存在一個資料類型的自動轉換問題。強型別的語言,比如 C、C++、Java、C#,不同類型的資料是不允許參與混合運算的,如果需要,必需通過一些方法(比如函數、類的方法)進行類型轉換。但 PHP 是允許不同類型的資料進行混合運算的(類似 VbScript),PHP 解釋引擎自動做了類型轉換的工作。

    2,瞭解 echo 的運算元

    echo 實際上不是一個函數,而是一個語言結構,所以它可以用成 echo('...'),也可以用成 echo '...'。echo 的運算元類型應該是字串型的。

    參考 PHP 手冊對 echo 的說明:

    文法:echo(strings);
    參數 strings 必需。
    描述:一個或多個要發送到輸出的字串。

    小知識1:注意 echo 和 print 函數的區別,比如:
    echo "123" . print("abc");  //文法正確,但輸出不是123abc,而是 abc1231
                                //原因是首先執行 print()函數輸出 abc,再串連"123"和函數的傳回值1
    print "abc" . echo('ooo');  //echo('ooo')會導致 Parse error: syntax error

    小知識2:echo 的簡化文法 <?= '...' ?>

    小知識3:echo() 比 print() 函數快一點點。

    3,瞭解點運算子的運算元

    點運算子的運算元是字串 strings。
    文法:strings . strings

    4,點運算子(.)的深入瞭解

    瞭解了前邊的1、2、3,是不是就完全能正確應用字串、echo、點運算子了呢?不盡然。熟悉文法和實際應用往往還是有距離的。再加上自動資料類型轉換,導致了一定的複雜性。

    樣本1:
    最一般的情況,輸出字串,比如 echo 'abc' . "123",結果是 abc123,沒什麼好解釋的。

    樣本2:
    echo true;
    輸出結果是 1。true 是 PHP 內建布爾常量,輸出前被轉換為字串"1"。

    echo false;
    輸出結果是空。false 也是 PHP 內建布爾常量,輸出前被轉換為空白字串。

    樣本3:
    echo 0=="ABC";
    輸出結果是 1。0=="ABC" 中,字串"ABC"首先被轉換為數值型(字串轉換為數值,還有一個規則,有機會再講),為0,再和 0 比較,結果為 true,再執行 echo true,為 1。默默地進行了 2 次類型轉換。

    再注意,echo 'ABC'==0; 結果還是 1。注意不是把 0 轉換為字串 "0" 再和字串 'ABC' 比較從而得到 false。呵呵,很詭異嗎?

    類似地有另一個題目:

    if('ABC'==0)
      echo 'yes';
    else
      echo 'no';

    知道到底輸出 yes 還是 no 了嗎?

    樣本4:再來個更詭異的。
    echo 100 . "ABC"; // 注意!點符號兩邊都有空格
    這句輸出 100ABC,因為 100 被轉化為"100"了。

    echo 100."ABC"; // 注意!點符號兩邊沒有空格,是連寫
    但這句報告語法錯誤!為什麼呀?因為 PHP 在這裡把點符號當小數點對待了,“100."ABC"” 當然不是個正確的數字了。

    echo 100. "ABC";
    只有點符號右邊有空格,語法錯誤。原因如上。
    echo 100 ."ABC";
    只有點符號左邊有空格,文法正確,輸出 100ABC。

    類似的:

    $a = 100;
    echo $a . 200; //點符號兩邊有空格
    輸出 100200。

    $a = 100;
    echo $a.200; //點符號兩邊沒有空格
    語法錯誤。“$a.200”也不是一個合格的變數吧。

    樣本5:
    echo 100 + "ABC";
    輸出結果是 100。注意不要認為這會產生語法錯誤,因為這裡的“+”號是算數運算子,不是串連運算子的誤寫。"ABC"被轉換為數字 0 了,加 100 後等於100,再轉換為字串"100"輸出來。進行了2次類型轉換。

    echo 100 + "20" . 30; //點符號兩邊有空格
    結果輸出 12030。

    echo 100 + "20" .30; //點符號左邊有空格,右邊無空格
    語法錯誤。.30 被當作 double 類型的 0.30 了。與 100 + "20" 的結果"120"直接擺在一起,PHP 分辨不清,報錯了。

    還可以舉出一些例子來。仔細體會,還是能找出類型轉換規律的,PHP 其實並不詭異。

    即使 PHP 的老鳥,以上的情況也未必能了如指掌,見過很多 PHPer,自認為路子很野,編程“立等可取”,其實仔細較真起來,知識結構就像一張蜘蛛網,網眼大得能穿過一頭鯨魚,根本談不上自稱體系。所以,還是需要虛心、靜心,沉下來學點基礎知識。AD:若願意,來我的西安 PHP 教育培訓中心一起學習、探討。

    作者:張慶(網眼) 西安 PHP 教育培訓中心(QQ群:108017660) 2010-5-5
    來自“網眼視界”:http://blog.why100000.com
    “十萬個為什麼”電腦學習網:http://www.why100000.com

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.