前幾天一位西安的 PHPer 給我說起一道 PHP 的測試題:
<?php
$s = ‘abc’;
if ($s==0)
echo ‘is zero<br>’;
else
echo ‘is not zero<br>’;
?>
好多人答錯了,認為答案是輸出字元串“is not zero”。其實正确答案應該是輸出字元串“is zero”。
原因其實簡單,因為 PHP 是一門弱類型的語言,它對變量沒有“必須先定義再使用”的強制要求,變量的類型也是根據指派的類型來靈活變化的。這一“靈活性”看似靈活,實際上埋下了錯誤的隐患。雖然 $s = ‘abc’; 語句定義了變量 $s 為字元串類型,但因為 if ($s==0)語句中,$s 是和數字型常量比較,是以 $s 這時被隐含的轉換成了數字型變量,其值是 0,是以 $s==0 比較的結果就為真。
犯這一類型錯誤的人一般是從 Java、C 等語言轉到 PHP 開發的程式員,因為 Java、C 等語言是強類型語言,是不允許不同類型的變量和常量互相比較的,在這種情況下會報告文法錯誤。
其實 PHP 語言的開發者并不是沒有注意到這類問題,在 PHP 語言裡還有一個嚴格比較的運算符“===”,要求比較的雙方必須類型一緻,把上述 if ($s==0) 語句寫為 if ($s===0) 就會避免前述錯誤的發生。
上面的問題提示我們,使用 PHP 這類弱類型的語言一定要注意變量類型的問題。在定義變量時可以賦一個初始值以同時定義其類型。而現在的大多數新開發的語言比如年輕的 C# 就是強類型語言,前述在 PHP 裡的問題在C#裡是不會發生的。
比較有意思的是,這位西安的 PHPer 給我提起前述的測試題并不是為了探讨技術問題,而是說,現在的 PHPer 好多是自學成才,基本功欠佳,長期撲身在項目開發一線,對一些細枝末節的技術問題無暇顧及,導緻犯一些隐含的、低級的錯誤,而這些錯誤有時是緻命的。
其實我也早注意到這個問題。我年初在 TM 群裡和一位有 4 年從業經曆的 PHP 程式員聊天,他提到他去一家公司應聘,卡在了筆試這一關。如果讓他在機器裡的 PHP 環境下答這些 PHP 筆試題,應該不是問題,拿不準的可以馬上寫一段代碼測試,但筆試要求所有的知識必須從人腦而不是電腦裡提取,這位有4 年 PHP 程式設計經驗的 PHPer 就傻眼了,其實那些文法大多數都是常用的。
PHP 語言和 PHPer 現在有一個奇異的現象,需求和程式員的供應沖突很突出,PHP 教育和教育訓練在國内也做的很一般,許多 PHPer 都是自學成才,甚至拿一段代碼就開始步入開發環節,結果是沒有建立系統的知識體系,基礎知識差,好多人還停留在面向過程的程式設計階段,而且振振有詞,号稱他們隻用編寫函數就能解決一切問題。一些人從來沒聽說過 PHP 裡還有架構,自然面向對象的思維就無從談起了。
PHP 的開發者其實野心還是很大的,他們打算把 PHP 打造成一個類似 Java 虛拟機的玩意,到時候用 PHP 開發桌面程式都不是不可能的。但現狀令人沮喪和擔憂,教育跟不上,PHPer 大牛成長不起來,PHP 的大廈可能隻能是一個小狗窩。
本人是一個 PHP 程式員和教員,但沒打算成為一個 PHP 的教徒和殉道者,僅僅是希望讓 PHP 幹些它自己能幹的事,目前看來它在網站建設、網際網路領域的應用非常優秀,比如流行的論壇、Web2.0應用、SNS 等許多系統是用 PHP 開發的。現在也有一些企業開發應用了 PHP 的一些開源架構,也非常不錯,沒聽說 PHP 開發的東西比 java 和 .NET 差。希望 PHP 和 PHPer 在中國一路走好,前途光明。
本文轉自網眼51CTO部落格,原文連結:http://blog.51cto.com/itwatch/286521,如需轉載請自行聯系原作者