[文摘] Another view of PHP.

好久沒寫部落格了,來灌水一下……

話說 Ant 寫了一系列關於 PHP 的文章,滿值得一看的,詳列如下:

先自我揭露一下,有一陣子 PHP 是我主要使用的程式語言,理由嘛……真的很方便,內建的東西幾乎夠你處理所有事情了,真的需要找 3rd party library 的情況好像還滿少的,再加上我本來就習慣在 Linux / Command Line 上做事,也習慣了 script,所以有沒有 IDE/圖型介面/執行檔 對我而言反而沒那麼重要。

相對的,PHP 只要用 VIM 打開,然後丟給 /usr/bin/php 就可以,超方便。之後呢?我就從 PHP 跳船了……理由呢?我找到其他更符合我需要的程式語言。 ;-)

OK,回題。

Ant 的文章頗值得一看,不過話說回來,他文章提到的點和我經常看見的 PHP 的批評似乎有點出入。

首先,『PHP 執行速度很慢』這樣的評論我還真的不常聽到,也很少在批評 PHP 的文章裡看到,這一定是誤解,而且 Computer Language Benchmarks Game 來看,PHP 至少和 Perl/Python 是平起平坐的。 :-)

至於第二點的『PHP 開發很慢』方面,我想必須要分成兩個方面來看:

  • 首先,我大部份聽到的都是 PHP 很好入門(我自己也認為這點為真,我的第一個網頁語言就是 PHP)
  • 如果有人拿 RoR 來比 PHP 的開發速度……我想說別鬧啦!RoR 是框架,PHP 是程式語言,蘋果不能比橘子啦!要比至少也要比 CakePHP/Symfony 這類的框架來比啦,不然的話就是 Ruby 比 PHP 啦,框架比語言是要怎麼比……orz.

所以,如果想要知道 PHP 最常被批評的點是什麼,我會比較建議看下面的文章: - I'm sorry, but PHP sucks! - Problems with PHP - Why do you hate/love PHP

接著為了鋪哏,要提一下 Ant 的第三篇裡的第一個例子:

$var = FALSE;
if ($var == 0) {
    echo "Err...";
}

不知道有沒有人和我一樣,覺得這段程式碼的執行毫無懸念的一定是會印出 Err...?因為,C 家族的語言裡 0 等價於 false 嘛,一堆程式語言也是這樣設定的啊!

別急……猜猜看下面這段程式碼會印出啥?

$var = "php";

if ($var == 0) {
   echo "PHP is 0";
}

if (0 == false) {
   echo "0 is false";
}

if ($var == FALSE) {
   echo "PHP is false";
}

if ($var == TRUE) {
   echo "PHP is true";
}

答案是:

  • PHP is 0
  • 0 is false
  • PHP is true

有沒有一種 What the F**K... 的感覺?XD "PHP" 是 0,0 是 false,但 "PHP" 是 true。XDDDDD

說實話,這些 PHP Sucks 的點真的有差嗎?我自己的經驗是……看運氣,有的點看似很糟糕,但其實對中規中舉寫程式的人根本不構成問題,舉例而言,只要你不是 PHP God 在寫 Divine by Zero,那上面的雷應該不會炸到你才對。

但很不幸的,有些東西是你不去惹他,他也會來惹你的……例如 Magic Quotes、例如 mbstring 等等。這真的就是看運氣了,因為我自己就被炸到過好幾次(因為 PHP 有洞,主機供應商升級 PHP,然後我的古早的 PHP 程式就爆炸了)……

上面,關於 Ant 原文補充完畢。接下來是打嘴砲部份,沒啥重點,可以略過應該也沒差。

話說回來,對於 Ant 的文章的一些觀點,我有不同的想法,以下是簡單的摘要:

每個程式都在進步,網路上很多對於 PHP 的漫罵還停留在 PHP 4 的時代,諸如 PHP 設計太爛之類的,但現在的 PHP 5,甚至將來的 PHP 6 之後,已有很大的改進。Ruby 的慢也在 1.9 之後改進不少。

對於這裡,我想說的是 PHP 有在進步是事實,但有他原始設計上的包袱也是事實。

特別是程式語言這種東西不是你說改就改的,很多東西從第一版的設計開始就種下了因,之後又要考慮到一堆相容性的問題,結果就會造成真正的洞很難補。不只 PHP,Java 不也這樣?!舉例而言,Java 當初設計時沒有考慮到泛型,於是 Java 在新版裡面加上去了,但實際上底層/舊版的洞補不了,所以 JVM 需要做 type erasure……然後就又出現一堆問題。

有時候我們指的”爛”,會不會只是個人的偏見?而我們是不是真的對該語言的特性及新改變夠了解呢?我想很多的問題其實出在「人」身上。

當然,很多時候『爛』是個人的見解,問題是很多東西是可以客觀評估的……

舉例來講,PHP 的函式命名風格不統一是事實,magic quotes 造成有些程式碼在有些機器上可以跑,有些機器不能跑是事實,references 的行為改變是事實,就像現在 Java 上的泛型需要做 type erasure 後造成 runtime 沒有型別資訊,讓一些事情變複雜一樣是事實。

而且,說實話我覺得沒必要忽略 PHP 本來就不是嚴謹地被設計出來的東西,而造成現在所擁有的包袱的這樣的事實。

還有一個有趣的現象是,為什麼寫出壞味道的 PHP 設計師比 Ruby/Python 還多?根據金字塔理論,底層(初學)的人總是比較多,再加上會認真學好程式語言的仍是少數。尤其當 PHP 設計師滿街跑時,你遇到的機會就高了。這個現象我認為是程式語言流行帶來的副作用,每個程式語言都會遇到。

這點我覺得很難說……我很難相信之前提到的那隻 Divine by Zero 是 PHP 底層的初學者寫的。XD

當然,我也看過寫很爛的 Java 程式,而 Java 據說是出了名的簡單?

另外,在我淺薄印象中針對 PHP 很多的批評,指的『程式不好』並非架構、程式碼風格、味道這類的,相對的是關於安全性的問題比較常見……你幾乎很難假設 PHP 初學者寫出來的程式會是安全的。

這種開放的精神,不會讓你在了解 Ruby on Rails 後,罵其它 MVC 框架的不是;不會讓你學會 Scala 之後,說 Java 的不是;不會讓你熟悉 C 之後,鄙視 Ruby 的慢。[註4]

好吧,我必須承認我覺得文章裡這段真的很跳 tone……首先,我看不出來程式語言設計上的好壞和註解裡的『我抄你、你抄我』有啥關係,應該說我看不出整系列的文章和這條註解有啥關係。

接著,我寫過 C/Java/Scala,Ruby 也試過幾次,雖然最後的結論是 Ruby 不是我的菜……我還是會說,C 很快但做簡單的事很麻煩、RoR 很威但是 Ruby 很慢、雖然我需要寫 Java 但他真的一堆設計上爛到爆,而我目前(因為常換)最喜歡的是 Scala,雖然他也有他的問題,但我覺得他在設計上最吸引人。

Why? 因為很多事情是事實……而我覺得根本沒必要去刻意忽略這些事實以及自己的偏好。知道事實,才能知道什麼情況下要用什麼工具(你總不會在需要 critical performance 時去用 ruby 吧) ,知道偏好,事情才能做的快樂。That's all.

回響