如果估計沒錯,在 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