以前的PHP有很多缺陷

一月 6th, 2010 由 victor Leave a reply »

有人在plurk上PO了一篇文章的連結,PHP 開發迷思 (三) – PHP 很糟糕?,因為我不認同那樣的看法,所以我回覆說php很爛,當你說一個語言很爛時,就要有心理準備有人準備要跟你戰了,果然有人不認同我的說法,當然任何人都可以不認同我所說的,而且好和爛是很主觀的,同時也是是相對的,但是我所說的是有根據的,說php爛不是我一個人的說法,而是已經被說到爛掉的說法,很多比我有經驗多的網頁程式設計師都異口同聲的說PHP很爛,為了解釋為什麼我認為PHP很爛(我在本文指的爛是指語言設計上的眾多嚴重缺陷),我寫了這篇文章

更新:

我承認這篇寫得有點偏激,也是以前的觀點,也是在發洩以前對PHP的不滿,我沒有寫較新的PHP,所以我收回PHP很爛,改成以前的PHP有很多缺陷,我想表達的是一款語言的很多缺陷,而且是在以前的缺陷,現在PHP確實有改進很多,所以我寫了一篇 如何評估比較程式語言

另外我想表達的一件事是,當有人說你用的程式語言有問題時,為什麼一定要這麼抓狂呢? 如果一個程式語言它的缺陷沒有人罵,大家都愛語言如命,那麼語言的開發者或團隊要如何知道這語言要改進什麼呢? PHP有很多缺陷是事實,然而說出來很多人可能就不高興,然而我選擇用較激烈的字眼是因為他改進實在太慢了,我們可以看到以前的Magic quote、unicode問題等等,至今都仍未解決,要php6才會解決,這些問題不是只有我覺得很糟,而是我發現很多人都跟我一樣覺得這太差了,我每次罵PHP都真的很希望他在下一個版本就把這些鳥問題解決掉,但以我之前的經驗它都讓我失望,所以我怨念很深,這篇文章寫起來也特別偏激,但我想表達的是,我說PHP爛某種程度是希望他變好,那你可能會問,我為什麼不說Python爛,然後哪裡爛,很簡單的原因是我太喜歡Python,當你很喜歡一個東西時你是看不見這東西的缺點,如果有人說Python爛,我覺得很好,我想知道他有哪些缺陷,是我沒看到的

除此之外,對於初學者來說,PHP的低門檻讓他成為吸引新手的蜜罐,而很多人都只知道PHP可以寫網頁,但是不知道其實所有程式語言都能寫網頁,我希望透過罵PHP也能讓更多人知道其實還有更多選擇,但其實這會讓人覺得反感,我在這背後目的是希望其它語言能夠有更多人使用,有競爭才有進步,而對於國內大部份人都只用PHP在刻網頁我也覺得很失望,我同時也希望讓大家知道其實網頁的技術現在已經很先進了,很少有人使用框架等次世代的網頁技術,所以有興趣也可以看一些較新的技術,而不是土法煉鋼

美與醜

當路上走來一個女的,一個人說她很正,另一個人說她很醜,美醜好壞基本上都是主觀的,而且是相對的,如果說走在路上的那個女生是世界上唯一的女生,那麼何從比較她的美醜呢? 我今天說PHP很爛,是基於我的經驗,和看別人的經驗,我有用不同的語言、工具寫過網頁程式,在這樣的情況下,因為經過比較才有辦法知道好壞,有趣的是在Plurk裡的討論有人甚至懷疑我沒寫過PHP,我個人比較喜歡就事論事,不太喜歡用質疑對方的立場來證明自己的說法,當別人懷疑你經歷時,你一樣可以這樣懷疑別人,像是「你們有沒有用非PHP的平台寫過網頁程式?」,「你們有沒有用現代一點的平台像是Django、ROR寫過網頁程式?」,但是這樣會讓問題失焦,到後來變成在檢視對方背景來決定他講這話是否是對的,而沒有去看這些話是否是真的正確或有道理,即使這是一個主觀的問題,而我描述的只是依我經驗和認知所得到的想法,每個人都可以不同意我所說的,但是那些確實是我所經歷過的,我可以說謊「天阿~ PHP好棒,大家快去學」,或是選擇不發言,但是當我說出「PHP很爛」,千真萬確是我的心得

我的經驗

我在小學六年級時家裡有了撥接的網路,在那時候開始學習怎麼寫網頁,當時所謂的網頁,也只是到處亂貼一些資料,整畫面閃來閃去的GIF圖檔,都是那時候新手網頁的調調,更誇張一點會加一堆亂七八糟的特效,上傳到免費的空間,我還記得當時申請的空間叫台北酒巴什麼的,當時真的覺得做網頁是件很酷的事情,在我學習寫程式之前其實大多都在做網頁,做破破爛爛的網頁,但是樂在其中,當時覺得程式真是很神奇的東西,有時會載一些用perl寫的cgi程式來架架看,光是架那些留言板或聊天室之類的,就是一件大工程,當時對於行末少一個;就沒辦法執行這件事覺得很驚訝,居然程式只要一個符號錯了就不能跑,那到底要怎麼寫?

當我上國一開始自己學寫VB6.0之後,因為有了VB6.0的程式設計經驗,我終於漸漸瞭解perl的cgi怎麼寫,這之中我記得我也有碰過ASP,因為他語法和VB一樣,但是並沒有太深入,後來因為我父親想弄一個放他文章的網站,於是我就用Perl-CGI幫他寫了一套文章管理系統,自己也順便做了一個個人工作室的網站

Victor工作室

我可以透過後台管理系統來新增消息,或是檔案下載等等,同時我也用Perl-CGI寫了一個留言版系統

Victor工作室 – 留言版 1.1 Beta

可以在這裡下載,在寫了這麼多Perl-CGI的程式後,發現PHP這東西好像漸漸流行起來,越來越多用PHP寫的網站、免費的網頁程式等等,在這之前幾乎都是Perl-CGI的天下,PHP做為後起之秀取而代之,因為他的門檻比Perl還低,同時比起Perl,PHP的程式也好懂許多,所以我也開始學習PHP,PHP絕對是當時最佳選擇之一,當之無愧,在寫的過程中有遇過不少問題,像是許功蓋問題,處理SQL Injection的問題,PHP的自動引號取代問題(Magic quote),這些是顯著的問題,但有些問題在當時一直感覺不太對勁,但是也說不出個所以然,像是它的形別等等問題,相較於我當時所會的VB,PHP是一款非常不嚴僅的語言,但是我在當時並不覺得它很爛,可能是因為不知道有其它選擇,又或著當時真的沒什麼選擇,所以一邊學PHP,一邊我就把之前寫的文章系統改成用PHP重寫,到今天我父親還在使用這套系統:

金門根本文采工作室

在這之後有很長的時間,寫網頁我也都是用PHP,直到我學會了Python,大約已經是大二以後的事了,在那時我選擇了TurboGears當網頁框架,那時我回首過去,才深深地發現PHP是一款多麼爛的語言,在當時他或許是開路先鋒,讓網頁程式開發的門檻降低到一定的程度,但是在我學習寫TurboGears時他還是一樣的爛,以前我遇過的那些問題大多數都還在,而且學會了Python這種清晰的語言更加地覺得PHP真的很污穢,在那之後我用TurboGears開發了一些網頁,我以前在PHP遇到的鳥問題從來都沒有再碰到過,開發的速度也大大加快,我能夠專注在我所想開發的功能上,而不是整天去處理那些鳥問題,安全性也大大提升,目前那些網頁還在跑的有

Walele創意投票系統 是一個線上投票系統,從決定到開發完成上線只用了一週的課餘時間,用的是TurboGears1

Now.In廣播平台 是一個線上廣播平台,目前還在beta版的階段,用的是TurboGears2

試鏡報名系統 用一個晚上寫出來的試鏡報名系統,可以上傳照片,後面還有一個後台可以看資料

我承認我寫的網頁程式其實不多,但是從我第一個寫的網頁到今天已經有十年以上,我看見網路的發展,網頁開發工具的演進,PHP在以前我不會說他爛,因為他是開路先鋒,沒有他網頁程式設計可能難以上手,但是這麼多年來他有在改進,但是改進實在太慢,問題還是一大堆,再加上他改進的方式都是疊床架屋,而不是正視問題並解決它,再者相較於現代的網頁開發工具,PHP真的是太落伍了,先天不良,後天失調,所以今天我才說PHP很爛,即使PHP有了不少網頁框架,還是擺脫不他那語言本身就一堆問題的原罪,他之所以會大流行,回首當時,不外乎就是當時正好缺少一個低門檻的網頁開發工具、平台,PHP來得正是時候,所以大紅大紫,但是即使再怎麼流行也不能抹掉PHP語言設計很爛的這個事實

其它人的看法

我知道我說的可能很多人不認同,又或著不相信,但如果是大部份有接觸過現代網頁開發平台,很有經驗的網頁開發者都異口同聲的說php sucks呢? 在Google搜尋 『php sucks』,可以找到一大堆的網頁,他們都在說PHP很爛,我在此引用幾篇他們寫的

I’m sorry, but PHP sucks.

這篇文章清楚地條列出PHP哪裡爛,會遇到哪些麻煩的問題,像是字元支援的問題、不相容的問題、它莫名奇妙的形別系統等等

PHP Sucks, But It Doesn’t Matter

這篇文章引用其它人的說法,和他自己的經驗來說明PHP很爛,他這麼說道

I’ve written both VB and PHP code, and in my opinion the comparison is grossly unfair to Visual Basic. Does PHP suck? Of course it sucks. Did you read any of the links in Tim’s blog entry? It’s a galactic supernova of incomprehensibly colossal, mind-bendingly awful suck. If you sit down to program in PHP and have even an ounce of programming talent in your entire body, there’s no possible way to draw any other conclusion. It’s inescapable.

大略翻譯是:

PHP很爛? 當然它很爛,你有讀Tim部落格裡引用的每個連結嗎? 它真的是宇宙超級霹靂無敵的爛,就算你有一身寫PHP的才能,也沒辦法下任何其它的結論,這是事實

On PHP

這篇文章整理了一整一大堆資深的網頁程式開發人員,對於PHP的看法,大略挑幾句來翻譯

Adam Kalsey:

If you want some support on your foray into PHP, please let me know. I’d love to lend a hand. ¶

It’s easy to write bad code in PHP. Or in Perl. Or in C. Or Java. I think two things contribute to the perception that PHP code is crap. First of all, when you write spaghetti PHP, it still works just fine. So unless you’re a professional programmer or maintaining lots of code, you probably don’t care that the code is crap.

Secondly, since PHP is easy to learn, is ubiquitous, and there’s lots of PHP examples on the web, it’s easy for a non-pro to pick up PHP and start monkeying with it. They learn bad habits and then publish their code and teach others bad habits. Some of the most popular open source PHP applications ever are really poorly coded. Gallery and Wordpress come to mind.

A hammer can be used to build a beautiful structure or a mis-shapen birdhouse. And it’s easy to flatten your thumb. With so many amateur PHP developers out there, it’s not surprising there’s a lot of flat-thumb code in the wild.

大略翻譯:

如果你想學PHP,請讓我知道,我很樂意幫助你

PHP非常容易寫出很爛的程式碼,對Perl、C和Java來說也一樣,我想有兩件事情讓人對於PHP程式碼覺得很糟糕,首先,當你寫出了垃圾程式,它一樣運作的很好,除非你是專業的程式設計師,或是維護大量的程式碼,不然你根本不在意那程式碼是些垃圾。

第二,因為PHP很容易學,很普及,在網路上有很多PHP的範例,很容易就有非專業的人用PHP來亂搞,他們學習糟糕的習慣,然後發表他們的程式教其他人這些壞習慣,很多流行的Open source PHP程式也寫得非常爛,說到這裡就想到Gallery和Wordpress

它是一把可以建造漂亮結構或是歪曲鳥籠的槌子,還有它很容易敲爛你的姆指,有這麼多業餘的PHP開發者,所以在外面有這麼多爛程式也不令人意外

Dominic Mitchell
(略) Every time I’ve looked at PHP, I’ve been unable to find out how they use placeholders in code that talks to the database. Yes, every database adaptor provides a quote function, but nobody uses it (consistently). And people wonder why PHP code is always full of security holes.

It’s a real shame, as I can see that there’s a lot to like in PHP. But it really needs to clean its act up to appeal to people coming from other programming languages, instead of just people coming from dreamweaver.

I actually heard David Heinemeier Hansson (sp?) talking about rails the other day. One of the key points he made is that it should be easy to do the right thing. That’s why Rails hits a sweet spot for me. But when you look at PHP, yes, it’s easy to code, but it’s not easy to do the right thing. That’s where it falls down.

大略翻譯:

每次我看PHP的程式,都沒辦法找到他們怎樣在程式碼中用placeholders來和資料庫溝通,是的,所有資料庫介面都有提供過慮(quote 就是取代掉特殊符號)的函數,但是沒有人去用它 (一致的),然後人們就很困惑為什麼PHP老是一堆安全性的漏洞

真的很丟臉,我看見很多人喜歡PHP,但是它需要向上提升才能吸引更多其它程式語言的開發者來使用,而不是那些從Dreamweaver跳槽過來的使用者

我前些天聽見David Heinemeier Hansson談到Rails (Ruby On Rails),其中有個重點是他很容易把事情做對,那就是為什麼Rails能夠贏得我的歡心,但是反觀PHP,是的,他很容易寫,但是他不容易把事情做對,這就是他失敗的地方

What I don’t like about PHP

這裡面也提到並列出PHP的一些經典缺陷,像是namespace (雖然5.3版新增了,但是詭異的是用反斜線來做區分),遞迴問題,Magic quote問題等等

PHP has two advantages: it’s very easy and it’s widely supported by webhosting companies. But that doesn’t make it a good language.

For very small projects, it can be a nice programming language. But for larger and more complex projects, PHP can show its weakness. When you search long enough, you’ll find solutions (work arounds) to some of the mentioned problems. So when a solution is known, why isn’t it fixed? And why are the fixes not mentioned in the manual?

It’s good that an open source language is very populair. Unfortunately, it’s not a great language. I hope all problems will be solved once (in PHP 6?) and we will have an open source language that’s open source and good.

Until then, when you start a project larger than five scripted pages, you might also consider C#/ASP.Net or Java/JSP as a better solution. And if you want really good (distributed) performance, you can look at some initiatives which have been popping up the last couple of years. Just to mention a couple of them: Nginx, Couch DB and Node.js. They all blow existing systems away.

大略翻譯

PHP有兩個優點,它非常容易使用,還有廣範地被webhosting公司支援,但是這並沒有使他成為一個好的語言

對所有的小專案來說,它可以是一個好的程式語言,但是對於大而且複雜的專案來說,PHP就顯得很弱,在你搜尋夠久時,你會發現部份這些提到的問題的解決方案,即然這些解決方案是已知的,為什麼這些問題沒有被解決? 還有為什麼這些修正沒有在手冊裡提到?

當一個open source的語言非常流行是一件好事,不幸的是他不是一個優良的語言,我希望所有問題都能一口氣被解決(在PHP6?),這樣我們就會有一個好的open source語言

直到現在,當你開始一個大於五個script檔案的專案時,你可能會考慮C#/ASP.Net 或 Java/JSP做為更好的解決方案,還有如果你真的想要好的(分散式)效能,你可以看某些這幾年創新的解決方案,例如Nginx, Couch DB還有Node.js,他們會趕走現存的系統。

Experiences of Using PHP in Large Websites

這篇很詳細地從語言的層面說明PHP語言設計上到底有哪些缺陷

Furthermore, PHP suffers from a related issue: the language was accreted, rather than ever having been designed. Most programming languages that have achieved genuine long-lasting popularity have been the work of at most a small team of gifted language designers. These designers have worked as much on deciding what to leave out of their languages as on what to put in. PHP’s creator, Rasmus Lerdorf, adopted a deliberate policy of letting others contribute freely to the development of the PHP implementation — and thus implicitly to that of the language itself. Where languages like C, C++, or Perl have had a Ritchie, Stroustrup, or Wall directing their evolution, Lerdorf does not seem to have applied the same sorts of controls to PHP. The result in some cases is that PHP lacks any sort of coherent world view. This in turn only increases the complexity for those trying to actually build working solutions with PHP.

大略翻譯:

除此之外,PHP受苦於相關的問題: 這語言是拼湊出來而不是被設計出來的,大部份有名望的程式語言都是由小部份天才語言設計者所組成的團隊的作品,這些設計師做了很多語言的某些特性是否該保留或新增的決定,而PHP的建立者,Rasmus Lerdorf採用討論的機制讓其他人自由地開發PHP的實作,也就是PHP語言的本身,像C, C++或Perl有Ritchie, Stroustrup, or Wall等人指導他們的演進,Lerdorf似乎沒有對PHP採用同樣的控制,做為結果就是PHP缺少了一貫的世界觀,這只使得要在PHP上建立解決方案變得更加複雜

從這段我們可以瞭解,PHP的設計的決定很多在亂搞一通,它原本的作者也對程式語言的設計沒有才能

A similar problem crops up with relational operators. PHP’s simple variables can contain either a number or a string. PHP converts between numbers and strings whenever necessary, so that the programmer need not worry about the underlying type.

That’s the theory, anyway; in practice, this makes it extremely difficult to compare two values of different types for equality. The standard PHP equality-testing operator is spelled ==:

$n1 = 0;      $n2 = 10;
$s1 = ‘foo’;  $s2 = ‘bar’;

$n1 == $n2;  // Numeric comparison, returns false
$s1 == $s2;  // String comparison, returns false
$n1 == $s1;  // Good question
$s1 == $n1;  // Is this any different?

The problem is that, when the values are weakly typed, and there is only one equality-testing operator, the language cannot determine the programmer’s intention. PHP has a variety of kludges to deal with this:

* Some programmers recommend using !strcmp($n1, $s1) to force a string interpretation.
* You can cast one or both sides to the intended type.
* PHP 4 has a === operator. It works the same way as ==, except that it additionally requires both sides to have the same type. This sounds initially like the perfect solution — just use === wherever you would otherwise have used ==. Unfortunately, you lose the convenience of being able to treat numbers and strings interchangeably: it is no longer the case that 3 === 『3″.

Perl has similar rules for its scalar variables: they can contain either a number or a string, and the language freely converts as necessary. However, Perl allows the programmer to express the intent: it offers both a numeric-equality operator == and a string-equality operator eq. PHP explicitly rejects this approach. The manual for PHP 2 says “Once you start having separate operators for each type you start making the language much more complex. You can’t use == for strings, you now would use eq. I don’t see the point, especially for something like PHP where most of the scripts will be rather simple and in most cases written by non-programmers who want a language with a basic logical syntax that doesn’t have too high a learning curve.” Unfortunately, in cases like this, the complexity is rather like an air bubble under freshly hung wallpaper: pushing it from one place to another will only leave more mess on the wall.

大略翻譯:

一個類似的問題在關係運算子出現,PHP的簡單變數可以包含數字或字串,PHP在需要時轉形成數字或字串,所以程式設計師不需要擔心底層的形別

這只是理論,一般來說,這使比較兩個不同形別不同值是否相等變得極度的困難,標準的PHP相等測試運算為 ==:

$n1 = 0;      $n2 = 10;
$s1 = ‘foo’;  $s2 = ‘bar’;

$n1 == $n2;  // Numeric comparison, returns false
$s1 == $s2;  // String comparison, returns false
$n1 == $s1;  // Good question
$s1 == $n1;  // Is this any different?

問題在於,當值是weakly type,且只有一種相檔測式運算子,語言與法判斷程式設計師的意圖,PHP有很多暫時的解決方案:

* 有些程式設計師建議使用 !strcmp($n1, $s1)來強迫解釋成字串
* 你可以轉型兩邊成為想要的型別
* PHP4有一個 === 運算子,它運作和==一樣,除了他需要兩邊是同樣的類型,聽起來好像是完美的解決方案 – 只使用 ===在你使用 ==的地方,不幸的是你失去了數字和字串相容的方便性,再也不能使用 3 === 『3″

Perl有一個類似的規則給他的純量變數,他們可以包含一個數字或字串,語言可以自由的在需要的時候轉形,僅管如此Perl允許程式設計師表答他的意圖: 他提供了數字相等運算子 == 還有字串相等運算子 eq,PHP明確地拒絕這個方法,PHP2的手冊說到 『當你開始有兩種不同的運算子給不同的形別時,你開始讓語言變得更複雜,你無法對字串使用==,你要使用eq,我不瞭解這用意在哪裡,特別是對像PHP這種將會非常簡單的語言,且在大部份情況下,PHP都是由非程式設計師來寫,他們只是想寫基本邏輯語法而且不想要一個太高的學習曲線『,不幸的是,像這樣的情況,複雜的情況就像一個在璧紙後面隆起的泡泡,把它從這裡移到納裡只會把牆弄得更遭。

又一個業餘語言設計者在PHP所犯下的設計錯誤,而且程式語言也都設計在於討好初學者,而不是更嚴僅

說了PHP這麼多壞話,這還只是冰山一角,任何有上過資工系』程式語言』課程的人都能發現PHP這程式語言一堆不合理的設計/實作,但是PHP也不是完全不可取,在寫小形專案時他就很不錯,這文章寫得真的很不錯,他列出了一個檢查表,讓你檢查什麼情況適合使用PHP

We have identified a number of problems that arise when attempting to use PHP on large websites. However, we do not claim that PHP should never be used, only that these issues make its use inadvisable in certain circumstances. The following checklist suggests questions that should be considered before making a decision to use PHP for a given project.

*How much control will you have over the deployment platform? PHP’s one-size-fits-all approach to the php.ini file makes it hard to share servers with sites that were developed with different settings.
*How many people will work on the site, now and in the future? PHP as a language lacks the features necessary to promote effective teamwork; the bigger your team, the greater the problems you’ll have.
*How big will the site be, in terms of numbers of distinct pages? This is related to the previous item: the bigger the site, the greater your need will be for language features that promote teamwork.
*How long will the site be expected to last? The longer it lasts, the more likely it is that significant design changes will be needed. If you use PHP in the obvious manner, major design changes are difficult. If you extend PHP with a templating system, whether ad hoc or carefully enforced, using PHP buys you little if anything.

*How experienced are the developers; and how complex will the site need to be? Experienced developers will find themselves hindered rather than helped by the language’s simplicity. Inexperienced developers will find the simplicity a significant boon — but if you have inexperienced developers trying to develop a complicated dynamic site, you will soon run into other problems.

大略翻譯:

我們確認了不少用PHP寫大型網站會遇到的問題,但是我們不宣稱PHP永遠不該被使用,只是那些問題造成在現在的情況下不宜使用,但是下面這個檢查表建議了一些可以在決定使用PHP來開發專案前需要考量的問題

* 你對於你部署用的平台有多少控制權? PHP的設定檔php.ini的一次設定影響全部的方式使得要針對不同網站使用不同設定變得很困難

* 有多少人開發這個網站? 現在? 還有未來? PHP是一個缺乏必要特性來增進有效團隊合作的語言,當你的團隊越大,你會遇到越多問題

* 你的網站會有多大? 有幾個不同的頁面? 這關係到前一個項目,網站越大,你需要的語言特性就要越好來提升團隊的合作

* 你的網站會運行多久? 你的網站運行越久,越有可能需要進行設計上的重大改變,如果你使用PHP是因為明顯的意圖,主要的設計改變將會非常困難,如果你用樣版系統延伸PHP,不管是臨時或是特製的,使用PHP都沒帶來什麼好處

* 你有多少身為開發者的經驗; 還有網站將會有多複雜? 有經驗的開發者會發現他們因為語言的簡單受到阻礙而非幫助,沒經驗的開發者會發現簡單是一個重要的好處,但如果你有沒經驗的開發者來試圖開發一個複雜的動態網站,你很快會遇到其它問題

該文章作的結論是

PHP is a convenient language for rapidly prototyping simple dynamic websites. Websites thus built can in many cases be deployed indefinitely, without spending time and money on refactoring code in a different language. PHP’s simplicity makes it a good language for inexperienced programmers, such as those moving from a pure page-design rôle to a site development one.

For more experienced developers, though, the language’s simplicity rapidly turns into complexity, slowing down the development process. These developers are the ones who have the skills needed to build large and/or complex websites; using PHP for such sites therefore tends to be a net loss. This tendency is reinforced by PHP’s lack of the linguistic features needed to promote working on large software projects. If your project is at all large or complex, it may be better to look elsewhere when choosing an implementation language.

In cases where PHP has been determined to be inappropriate, what language should be used? There is considerable choice here; few languages are as bad as PHP for doing serious development work. The author and his colleagues have had good results with Perl, and believe that languages such as C++, Java, and Python should serve equally well.

大略翻譯:

PHP是一個用於快速開發簡單動態網站原形的語言,在沒有花錢和時間重構成不同的語言前,網站在很多情況下都不能被明確地部署,PHP的簡單使它成為一個給沒有經驗的程式設計者的好語言,像是一個單純從事頁面設計開發的人

對更多有經驗的開發者而言,語言的簡單很快的變成了複雜,減慢了開發的進度,這些開發者是有能力開發建置大形的複雜網站; 使用PHP在這樣的網站會傾向於成為平白的損失,這些傾向是來自於PHP缺乏對提升大形專案開發工作的語言特性,如果你的專案是大且複雜的,在選擇實做的語言之前最好去找其它的選擇

當PHP被認為不適合時,該使用什麼語言? 有很多選擇; 對於開發重要專案,很少有像PHP這麼糟糕的語言,作者和他的同事用Perl有好的結果,且相信像C++、Java還有Python可以有同樣好的結果

雖然從設計哲學看來我不喜歡Perl的哲學:

There’s more than one way to do it

而比較喜歡Python的

There should be one– and preferably only one –obvious way to do it.

但是做為一個程式語言,Perl的設計絕對比PHP好上太多了,PHP真的是拼湊出來的

PHP的問題

你可以在上面這些文章中發現,現在是2010年了,以現今的眼光來看,PHP確實是爛到暴炸了,有人反對我所說的,是說程式是人寫的,所以程式的好壞是在人而不是在程式語言本身,而且也有很多人有提到PHP可以寫出很棒的程式,這我也很認同,但是如同這些人也有提到的,要寫出優良的PHP程式非常困難,為什麼? 因為他有太多缺陷了,是的,不可否認他的門檻真的很低,但是那些缺陷就像是地雷一樣,而它的門檻就像是雷區的鐵絲網,讓大部份人可以跳進雷區來玩,不懂那些瑣碎的語言缺陷,很容易就被滿地的地雷炸飛,只有少數的人能夠熟知地雷的位置,在這雷區中行走自如,那是非常困難的事,換言之,PHP的學習曲線一開始是很平緩的,大部份人都可以快速上手寫出簡單的程式,但是當要寫的東西越來越複雜,要懂的東西就不是一般的多和瑣碎,因為那些問題都來自語言的設計不良,不瞭解就很容易誤用或濫用,所以到後來的學習曲線會很抖,而就算你懂也會那些問題,還有另一個疑問,為什麼要堅持用這個破爛而不知進步的爛語言? 而不改用一個更優良的語言或開發平台呢?

今天我會說他爛,有很大部份原因是因為我想讓大家瞭解,其實除了PHP以外還有很多網頁開發的平台,而和這些現代的網頁開發平台相較之下,單純用PHP開發網頁真的是宇宙超級霹靂無敵爛,拿框架比語言是很不公平,但是就算是比較語言本身,PHP一樣還是很爛,但是他也有他的優點,就是他非常流行,所以教學、資源、範例、現成的程式等等,都很豐富,而且門檻很低,進入地獄的低門檻,這樣的優勢能夠持續多久? PHP這麼流行,加上我們從上面看到引用的文章就知道,PHP改進的商討是笑話,一堆業餘的程式語言設計師在一起做出爛決定,很難做出痛改前非的重大且正確的改變,君不見PHP做出多少讓開發者罵到臭頭的爛決定,被罵了多少個版本才改回來,除非PHP真的改掉他那些壞毛病,不然如果想走向專業的話,我不建議學習PHP,但如果只是業餘和興趣,PHP真的是很不錯的玩具

說他爛的同時,我也希望他能夠變得更好,但是以我過往的經驗,PHP所謂的改善,總是讓人失望加憤怒,以最有名的例子Magic quote來說,我有一次發現我的PHP程式出問題,才知道原來是新版本的PHP會自動幫你escape引號,他的出發點是好意防止SQL Injection,但是欠缺深思熟慮,他這樣做使得既有的程式碼,正確地以mysql_escape之類函數來escape特殊符號的程式,需要特地寫workaround來解決此問題,再加上這樣的特性是可以設定改變的,所以你得花更多一點心力去判斷它是否有啟動Magic quote,這是在懲罰程式設計師,討好初學者,我不知道為什麼PHP社群會做出這樣令人傻眼的更新,不可否認地這樣做確實是救到了很多不懂得過慮 SQL Injection的新手,討好了新手,打了老手巴掌,但是卻開啟了更多問題,這類的改進方式,我記得在PHP的改進過程中遇過不少,都是令人傻眼的』改善』

替代的方案

現在其實已經有太多新的網頁技術可以使用,不管是哪一個,都比直接寫PHP來得好,但是缺點就是入門門檻比較高,目前資源比較少,又或著在國外資源很多,但是國內中文資源很少,如果要走向專業的話,絕對值得投資,以下列出一些我所知道的解決方案

TurboGears

集合各種Python最好的函式庫而成的網頁框架,可以說是集大成,它的特性是組件之間的藕合很鬆,所以可以換置組件,我個人就是使用TurboGears,他有一個有驚人的視訊影片,由TurboGears的作者親自示範如何在20分鐘裡寫出一個Wiki程式,有興趣可以下載來看看

20分鐘寫Wiki影片

知名的Open source網站Sourceforge.com就是用TurboGears2寫的,可以參考這篇文章

TurboGears on Sourceforge

Django

不同於TurboGears的集大成,Django所有組件都是量身打造的,因此他的藕合度比較高,但是因為原本就是商業用途,所以有較多的實際商用經驗

Ruby On Rails

基於Ruby語言的網頁框架,因為我不懂Ruby,所以不太熟這款框架,但我知道網路上有高手在24小時之內在八八風災期間寫出物資需求回報的網頁程式,開發效率也相當好

使用PHP的框架

有人說PHP也有優秀的框架,而且用框架比語言很不公平,所以我加了這條,使用PHP的框架能提升一定程度的生產力,雖然他減清了某些負擔,但是少有框架是完全不用寫程式的,當你需要自己寫PHP的程式部份時還是得面對語言缺陷,以下是知名的PHP網頁框架

Symfony

Zend framework

CakePHP

成功的例子

當然你聽到這些莫生的名詞,可能會懷疑這樣的東西真的可行嗎? 就像我當初的疑問一樣,但是現在已經有越來越多的網站往這些新世代的網頁以這些新的技術為基礎,或是舊的網站改用新的技術重新寫過,舉幾個我所知道以Python為語言的網站有這些

Plurk

Youtube

Sourceforge

Reddit

Justin.tv (用的是Twisted)

最後

我知道我講的這些可能聽起來很刺耳,但是確實是我所見所聞,你可以不認同我所說的,反駁我所說的,只要是理性的討論都歡迎並且尊重,請勿進行人身攻擊,還有我想知道有沒有用過現代的網頁技術,回頭去看PHP覺得是很好的,我也希望能瞭解這樣的想法

更新:

  • 2010/1/7 強調PHP爛在語言設計,拿掉一些太偏頗的比較(語言和框架),和增加另兩個網站連結,以及PHP的框架,還有增加PHP腦殘設計決定和checklist的翻譯
書籤:
  • Hemidemi
  • funp
  • MyShare
  • udn
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • YahooKimo
  • Haohao
  • TwitThis
Advertisement

34 comments

  1. Brian Hsu 說道:

    我也覺得 PHP 和的程式語言比較來真的過時了,而且 PHP 真的很容易寫出爆爛的程式碼。

    我想他唯一的好處就是幾乎各家 host 商都支援,而且用來寫一些用了就丟的東西很適合。

    例如……學校資料庫課程的 project?XD

  2. Brian Hsu 說道:

    另外補一下 Ruby on Rails 的部份。

    Twitter 的前端用 RoR,後端則是 Scala,還有 GitHub 這個程式碼集散地大站,也是用 RoR。

    已經有很多實例證明上面這些框架是可行的,而且支援的主機商也愈來愈多,真的想要往 web 程式發展,已經沒理由緊抱 PHP 不放了……

  3. victor 說道:

    http://www.php.net/~derick/meeting-notes.html#adding-goto
    http://stackoverflow.com/questions/19388/goto-command-in-php6

    剛看見PHP6要增加類似goto的語法,我真不懂PHP的社群到底在想什麼,似乎他們的哲學是不爛不加嗎? 雖然說是有限制的goto,而且是使用break當語法,但是這用到的機會到底有多少? 加上只是讓程式更難懂,更容易寫出爛程式而已,PHP還不夠容易寫出爛程式嗎?

    他們為了一點點的好方便,罕用到極點,而引進一個壞處更多的語法,更容易誤解,有個奇怪的社群在改進PHP,難怪一直這麼爛…

  4. yegle 說道:

    php是一门用来完成quick and dirty工作的语言,我经常用php脚本完成本来应该用bash脚本完成的工作

    另外博主的举例不当。莫非google出一堆life sucks,您就真的觉得生活无望吗?

  5. roga 說道:

    It’s no surprise they blame PHP.

    Yes, PHP is bad because a caveman can write some code in PHP. Later it makes a bigger problem when that caveman didn’t have good programming fundamental.

    Otherwise PHP is a very strong and efficient language.

  6. mikespook 說道:

    有时写程序写到某个份上,对语言有抱怨是非常正常的,不过对于这么敏感的话题,用有诸多纰漏的论据来证明,是不严谨和科学的。

    php本身不烂,只是烂的 phper 比较多而已……

  7. victor 說道:

    @yegle:
    我想表達的只是很多人都說php sucks,至於很多人說php sucks,當然不一定代表php就sucks,但是重點放在於他們說了些什麼,他們為什麼認為php sucks,而不是在筆數上

    有趣的是,我搜尋了一下life sucks
    約有26,100,000項符合life sucks的查詢結果
    約有29,300,000項符合php sucks的查詢結果

    就如同我所說的,重點在於他們說了些什麼,而不在於筆數,當然,筆數雖然不能做為絕對的證據,但至少能做為參考,如果世界上沒有任何人覺得php sucks,那麼出來的結果應該是遠少於這個數字,但可惜不是,雖然有爭論,但由這數字可以肯定的是,認為php sucks的人為數不少(看很多人的文章、還有回應)

    當然,就如同我所說的,認為他好或爛是主觀的,如果我們能夠統計所有網頁程式設計師,他們的經歷,還有對於php好壞的看法,那麼或許我們可以下一個結論 : 大部份的網頁設計師覺得PHP,但是這是辦不到的,因此就只能從其它方面來討論

  8. victor 說道:

    @roga:
    Yes, you can say that it’s all man’s falut, not the tool’s. But how about a bad designed tool that can hurt you easily and hard to use? For example, once you bought a car, and it is bad designed, and it explode under some normal conditions, or you can hardly expect how it react if you push a button. Won’t you say 『This car sucks』?

    As I said, people compare, and judge. If the car you bought is the only one car in the world, and there is no bad car. But how about comparing to other cars?

    PHP is a very very bad designed tool, even trained professional C/C++, Java…. programmer can abuse PHP easily. You can see some replys in the articles I linked, people talking about they are professional programmer in other language, but they can’t deal with PHP easily. Is that programmer’s falut? There are just too many strange behaviors, badly supported features in PHP. As a language for building homepages, it is a joke that it badly support unicode.

    If you want to handle unicode. You need an articles like this:
    http://www.phpwact.org/php/i18n/utf-8

    Why you need tons of article telling you how to deal with so many pitfalls of a language?

    Again, it is a joke, a language is for building websites that doesn’t support unicode well. What’s more, it is 2010 now, not 2000.

    I really respect for those talent programmers who can write beautiful programs in such a bad designed language PHP. They are genious. How can they workaround those freaking pitfalls in that language? As a normal programmer, I really don’t want to learn how to deal with those pitfalls and glitches. All I want is to build a web application. PHP make it very difficult to do the thing right. And that’s how it sucks.

  9. 老王 說道:

    我使用PHP,但從不在意旁人對PHP的看法,無知者無畏,何況任何一種語言其實都能找到大把的反對者,這沒有什麽奇怪的,語言不重要,重要的是思想,沒有好思想的人,用什麽語言都很難寫出好代碼,倚天劍,屠龍刀都是神兵利器,但是真放到某些人手裏,我覺得他不但成不了武林盟主,反倒會惹來殺身之禍。胡適先生有句話說的好:多做些事情,少談些主義。這同樣適用於語言優劣的問題。

  10. victor 說道:

    @mikespook:
    世界上沒有完美的工具、語言、平台之類的東西,所有東西都有它的缺點,但PHP是集缺點的大成,但即使這樣也有他的優點

    你說我證明他爛的方式有問題,但也僅只於你說有問題而,而問題是什麼並沒有提出來,說真的PHP問題如果是一個兩個就算了,他是有一大堆的問題,在我貼的連結裡都有寫,有些問題可能已經改進了,但是問題一樣還是一大堆

    我有好一陣子沒寫PHP,但是在記憶中那些問題都有遇過,PHP是寬鬆的語言,寬鬆是好處還是壞處呢? 寬鬆讓新手可以容易的寫出好像可以跑的程式,請問那程式是真的可以跑,還是剛好他運氣好可以跑,但有潛藏的問題? 而反面來看就是他不嚴僅,做為程式語言,應該要盡量在開發時就把問題找出來,但PHP不是,大多時候你濫用了、誤用了,甚至是打錯字,因為他的寬鬆,很容易寫出潛藏危機的程式,當然你可能會說這是寫程式的人的問題,不過如果比較其它較嚴格的程式語言像Python呢? 寫出那樣的程式的不是沒有,但是機會較低

    遇過的問題還不只這些,只是有點年代,只記得寫PHP時我罵過不少髒話,而且我記得罵那些髒話都是因為PHP一些設計甚至是實作很爛的地方,只是一時想不太起來細節,如果我現在回頭再去寫PHP,我能把我寫到遇到的一大堆計不良的地方指出來,可是我沒那個時間,而且PHP設計很爛是公認的事實,網路上一堆文章都指出PHP的一大堆缺點,最近有改善,但大部份問題至今仍不見改善

    更慘的是PHP的所謂的改善通常是疊床架屋,製造新的問題,舉個例子,像是Magic quote,一開始遇到這問題覺得莫明奇妙,為什麼好端端的程式會錯,後來才發現PHP居然改版自動將引號escape掉,身為一個知道SQL Injection和怎麼對付的程式設計師來說,用mysql_quote之類的函數是理所當然的事,PHP的改進是在幫我倒忙,今天為了讓我的程式能在我租的主機上跑,因為裝了新版的PHP,所以我得針對這個進行workaround,更慘的是這設定是可改變的,如果直接寫workaround,程式就失去移植性,還得特地加上判斷,看到底有沒有Magic quote,你說PHP的社群不腦殘嗎? PHP這程式語言是設計給三歲小孩寫的嗎? 還需要你來特地替我慮掉引號

    這表示什麼? 表示PHP社群在改進語言很多都沒有經過深思熟慮,只是覺得少了什麼該加什麼就加進去了,如同我在上面的回應,PHP6將引進有限制的goto語法,好處在哪裡? 在很少很少的情況下,寫起來比較方便,但是因為這樣,能夠濫用、誤解、困惑的情況增加了,PHP的改進一直是在增加問題,而不是徹底的解決問題,這也是為什麼,2010年了,十幾年過去了,PHP還是一樣爛到暴炸的原因

  11. HeChian 說道:

    唉,算了吧
    我是認為不管PHP是好是壞,它都是一個可讓人完成事情的工具
    PHP在某些情況suck,但另外一個角度來看卻也有可能是優點啊
    在對的時候採用對的技術用對的語言來完成事情才是最重要的:)
    一點淺見啦:)

  12. roga 說道:

    hi victor,

    maybe you can take a look for codeigniter.
    it’s an excellent framework for building a website, and avoid the problems that you mentioned.

    by the way, PHP has weakly typed of variables, i think it’s the worst defect at all. lots of people hates it. me neither.

  13. Ricky 說道:

    拿framework來跟程式語言比,這不恰當吧。
    沒了RoR,ruby寫出來的東西也會很suck。
    php上也是有很多重量級的framework,symfony,cakephp….樓主可知Yahoo有將近一半的專案是用symfony完成的。

  14. Mark 說道:

    A-ha … 聽說 php world wild 最成功的網站,叫做 facebook , 台灣最大的網站叫做 yahoo …

    這到底在比什麼啊! :D

  15. victor 說道:

    @老王:

    那如果是兩個功力相當的武林高手,一個拿菜刀,一個拿的是倚天劍呢? 我會說它爛,某種程度來說,我也希望他進步,但是每次都讓人失望,就如同我上面提到的Magic quote,他的改版居然是去用很蠢的方式去補新手會犯的錯,犧牲正常程式設計師的便利性以及帶來更多的問題,不可否認PHP比起以前已經有很大的進步了,但是大家都拿AK47、M4A1在火拼了,武林高手持菜刀,好吧,或許劍氣所到之處連掃把都能拿來殺人,但是這樣的高手又有多少?

    矇著自己的眼睛不承認PHP語言設計上的缺陷,我相信各位在寫時都多少能感受到那些,他很多所做所為很多都只是在討好入門的初學者,長久下來他就會往那方向發展,而PHP的使用者數量雖然可能一直在成長,但是會變成終就只是更多業餘的使用者

    最後PHP就會走向VB的後塵,有人說PHP是21世紀的VB,這個Screencast的作者如是說:
    http://www.archive.org/download/SeanKellyRecoveryfromAddiction/Recovery_from_Addiction.mov

    我希望PHP能更好,從語言設計層面的提升,而不是只能誇耀他的流行,當PHP如果能夠變得更好,網頁設計的整體素質也會整體上的提升,有競爭才能帶來進步

    @Ricky:

    我當然知道拿framework和語言比不公平,這點我在文章裡有提到,我指的爛是PHP的語言本身的設計,我今天說』PHP很爛』,可能你們都不同意我所說的,但我如果改說』PHP語言本身設計很爛』,我想這點應該很難反駁,那些連結中指出這麼多缺陷,還有更多沒提出來的是PHP的社群時常做出一些腦殘的改進方式,Magic quote是其中一個

    我剛才看了一下你提到的symfony的screencast,很有趣的一個Framework,光靠修改config檔就能夠自動產生管理介面,相當令人印相深刻,確實很有效率,有不少東西在TurboGears裡也有出現,像是validator,表單或管理介面的產生等等,但是使用PHP的framework當修改到PHP程式碼時,還是是一樣得面對語言的不良設計

    舉個例子:

    if (『false』 == false) echo 『true\n』;
    // => false

    if (『false』 == 0) echo 『true\n』;
    // => true, wtf

    取自http://maurus.net/resources/programming-languages/php/
    的詭異例子,像這類情況難以預料的事情在PHP裡裡有不少,所以我覺得很讚嘆,PHP這樣的爛語言能寫這樣有趣的framework,不過當Framework出問題要寫workaround時,你可能得祈導你真的能像他們這麼神勇

    以我寫TurboGears的經驗,它也有一些問題存在在官方的更新出來前必需自行解決,但是Python沒有在語言層面這麼多容易出錯的陷井,加上Python為了可讀性下了很大的功夫,所以我可以不用花太多力氣讀懂TurboGears底下的原始碼,然後寫出workaround來解決這個問題,連我這只會打嘴砲的人都辦得到就是最好的證明,加上Python語言的哲學就是明言勝於暗喻,所以寫起來也都是照預期在執行

    你可能會覺得社群會幫你解決,但是有些問題可能真的得你自己去解決,舉個例子,像是TG2他在處理多國語言的選擇時,2.0版沒辦法自動依瀏覽器的accept-language選到對的語言,所以我就得寫workaround,因為通常和unicode或多國語言相關的問題,開發者常因為是以英語為母語的國家,所以這部份他們測試不多,也不急迫,通常這類問題得自行解決,因此當你需要寫到框架幫你準備好的東西之外的PHP程式碼或修改framework原始碼時,就得小心php語言的原罪

    我今天所說的是PHP語言本身設計很爛,不可否認他有很優秀的框架和眾多的現成應用程式,但是語言設計真的還有待改善,這也是我指的他爛的地方

  16. 陳小白 說道:

    你在學習的過程中用了 PHP 解決你生活上的疑難雜症

    現在懂得一些皮毛了

    開始回頭嫌棄這個語言有多麼不好

    這種感覺讓人覺得很差勁。

    我覺得你可以去付出點心力去改進 PHP 的設計

    每個語言都有它的優劣勢,但你不應該嫌棄 PHP 很爛

    程式語言是因為』問題』才會誕生的

    它是隨著時代潮流不斷的在演化

    它不可能有完美的

    網站也不是用寫的,它是靠頭腦在規劃的

    沒有人會在乎你的網站用了什麼大技術、什麼框架,他們只會把焦點放在你的這個網站好不好用,易用性高不高,動線是否流暢。

    最後,我還是要說

    不要輕易批評語言的好壞,就算你是再資深的工程師也是一樣

    你要記得,你是倚賴著先行者、前輩的經驗累積,才得以生存的

  17. Ricky 說道:

    if (『false』 == false) echo 『true\n』;
    // => false

    if (『false』 == 0) echo 『true\n』;
    // => true, wtf

    會寫出這樣的東西表示他對php根本不了解
    php有強型態跟弱型態boolean比對

    例如

    if(false==0) echo 『true\n』;
    // => true
    if(false===0) echo 『true\n』;
    // => false

    == ->在php的觀念中會先作型態轉換再去作boolean運算。
    === -> 不做轉換,直接作boolean運算。
    兩個結果是完全不同的東西。

    至於Magic Quote又是另一個原罪
    在10年前誰會想到SQL Injection?
    問題是有多少的程式還在用php3跑,至少我遇過很多。
    如果要採取Python3的偏執作法,搞得沒幾個Python2的程式能在Python3下運作。
    一個設計的再好的東西只能淪為藝術品。

    你能想像你的程式每隔兩三年就得大改一次,只為了迎合』比較先進』的觀念?

  18. 路人S 說道:

    你可以比較優劣,我相信大家也會認同你的觀點,但何必故意用爛這個字眼哩?

    寫 Python 的人都不一定敢這麼狂妄哩 :P

  19. victor 說道:

    @陳小白:
    以前的PHP爛是沒話說,現在我不敢說,但我想說的是,說它爛又如何? 你有看見裡面有一篇文章標題是 『PHP sucks. But it doesn’t matter』

    如果大家都部抱怨PHP爛,PHP會把那些問題改掉嗎? 大家都愛語言如命,哪裡爛也裝作沒看到,默不吭聲,PHP的社群會改善嗎?
    我承認這篇寫得真的很偏激,觀點也確實在三四年前,但是某種程度來說,說他爛我是希望他能變好,但是很討厭的是,當你說一款語言哪裡有缺陷,他為什麼爛,就有一堆人跟你戰,說真的如果不是大家砲轟PHP的那些缺陷,PHP的社群會自動改掉那些嗎? 我不知道,很難說,不過我承認我現在寫這些是馬後砲,如果兩三年前寫就不一樣

    以前寫PHP,每次都希望他能改版改掉以前那些蠢問題,很多問題不是我在罵而已,大家都在罵,但是每次都讓人失望,甚至namespace是到近期才加的,unicode到現在還未解,要到php6才能解決,一次一次的改版都讓我失望,遇到那些問題都忍不著罵髒話,還甚至改版跑出magic quote之類的東西

    你看見PHP這麼多人在罵,但是為什麼問題遲遲沒有改善? 為什麼? 原因很簡單,他從一開始就很有問題,所以他現在都在還以前造的業,當然有人會說這是沒有辦法的事,以前的環境就是那樣,但是做為一個開發者,我沒時間去等一款語言慢慢還他以前所造的業…,所以就選擇放棄PHP,直至2010,他還在補以前的缺失,因為我認為他會因為這樣跟不上時代的潮流,語言的天性低門檻使他大紅大紫,但是低門檻不能做為長久的優勢,會越來越多替代的方案都比PHP好….

    至於要改善PHP,我承認我很弱,我辦不到,也沒有時間,加上我也放棄它了,如果哪天他改版合我胃口,我可能會再把它撿起來

    而如果有如說Python爛,如果他說得出哪裡爛,為什麼爛,我覺得很好阿,你又多知道這個語言的特性了不是嗎? 而且如我上面所說,如果大家都說這特性很爛,那麼社群才知道哪裡要改善,不是很多人都說每個程式語言都有優缺點,為什麼非得聽到說某個語言爛就很抓狂呢?

    Python也有他爛的地方,舉個例子

    def foo(value = []):
    value.append(10)
    return value

    這裡的value的預設值的那個list只會被建立一次,所以你第一次呼叫會拿到
    [10]
    第二次會是
    [10, 10]

    這樣的結果有點違反直覺,這是缺陷還是特性很難說,但是它違Python的精神,明言勝於暗喻,因此這算是它的pitfall

    @Ricky:

    Magic Quote不是10年前出現的,就算你要解決以前的問題,也沒必要拿未來的相容性和其它更多問題來換,Magic quote預設為開這就是腦殘決策,如果你說為了以前的安全,那可以把它預設為關的功能,幹麻非得強暴一般使用者?

    PHP在現在有了很大的改善,所以說PHP很爛我收回來,改成以前的PHP很爛,而我會說他爛,是他真的太多缺陷了,至少我以前在寫的是候是如此,為了那些莫名奇妙的缺陷我吃了不少苦,我承認這篇是在發洩我以前的不滿,PHP現在因為正在解決以前的問題,所以

    所以,我有另外寫了一篇』以前的PHP很爛』
    http://blog.ez2learn.com/2010/01/08/old-php-sucks/

    另外,Python2和Python3改版不大,它所造成相容性的問題絕對不會像php以前改版那樣,同一個主要的版號居然行為有很大的不同,一直不停在打破相容性的情況

    而且python2 到 python3有程式可以自動轉換,但還是有些不行,所以python作者自己說大約要兩年才能全跟上

    一個語言大刀改版是好是壞,我認為是好的,PHP也有改版不少不是嗎? 一樣也會打破相容性,你為了討好以前的使用者,而選擇不改進,5年可能你的程式語言還很多人用,10年可能就只剩下所謂的遺產了,大家都在進步,就你為了相容性一直疊床架屋,遲早會出問題

    很多東西都是以前設計的原罪,像是x86就是,他以前為了商業競爭加一大堆亂七八糟的指令,所以後來x86的晶片設計就很困難,處處受到以前的限制,但是又很難全部丟掉以前的相容性

  20. huge 說道:

    facebook也是php based website

  21. wo 說道:

    每个东西都有他存在的道理。
    不能直接说好与不好。只能说,更适合吧。

  22. 現實 說道:

    現實的社會是,能夠帶給公司利潤的語言就是好語言
    php提供龐大的廉價勞力,所以一點也不爛

  23. 高藥師 說道:

    你的文章真的很棒

    可惜字小了點

  24. observer 說道:

    为什么有那么多人在留言中为php说好话?没办法了本来是潜水流,看不下去了不得不说两句。

    php就是烂到不可思议的一种语言,很多莫名其妙的设定,使用时无法言语的无力感和挫败感。不过,再土鳖的语言也能写出好东西来,我不会因为facebook就说php好,php还是烂东西,只要我能自由选择,我绝对不会去用php写网站,python要比php好用太多了。

  25. kizzss 說道:

    php之所以流行时因为有着它独特的优势,在优秀的设计师面前,它可以变的很优雅。

  26. 討論一下 說道:

    大家好喔~

    大家或許可以討論一下:

    1.有什麼機制可以讓PHP社群盡量改善PHP的缺點

    2.PHP的缺點如何改進的做法的細節

  27. 討論一下 說道:

    以下是大陸的網站對於這篇文章的討論,
    可以參考一下:

    PHP很烂?我的看法 – 阮一峰的网络日志

    http://www.ruanyifeng.com/blog/2010/01/does_php_suck.html

  28. Eason.wu 說道:

    我只能說… 應該是你在學寫 php 的時候遇到了困難,自己突破不了就開始恨 PHP -_-

    就跟我當初 MySQL 用的順順的,因工作需要改用 PostgreSQL 後,一開始也覺得 postgres 有夠爛的,一直罵…

    但是我有突破那個瓶頸到了另一個水準… 開始覺得 posgres 也很好用!!

    你可能需要試看看你有沒有辦法突破你自己的瓶頸… 這才是你所需要花時間的地方… 把去尋找 PHP 不好的理由改為去學習他會對你更有幫助!

  29. victor 說道:

    @Eason.wu:

    很有趣的說法,但請問我提到的缺陷哪一樣看起來像是突破不了的困難之類的? 我討厭PHP是出自於它的缺陷,還有社群一面倒向簡單易用而犧牲進階使用者的部份,你要不要也說我文章裡提到的那些人的會說那些,都是因為自身突破不了才說PHP爛?

    只會罵和知道和理解問題出在哪並尋找另外的解決方案是兩回事,我除了罵他爛我還有花很多時間和自身的經驗整理並瞭解他問題出在哪,做為工具的挑選這些都會是考量的重點,如果你找了另外一個工具這些缺點都重覆出現,那你所做的選擇是愚蠢的,我花了更多時間在找更好的解決方案,請問你在當初覺得PostgreSQL爛以外,你有試著去探討問題出在哪裡嗎?

    學習一項技術是一種投資,也需要成本,如果一項技術很糟糕,有那麼多缺點,而目前有新的技術出現並且缺點比較少,已經證明可行,如果是在5年前可能新的技術還沒成熟,到了今天次世代的網頁技術已經如此成熟,產品等級的網站隨處可見,那為什麼要選擇較差的那個解決方案? 是因為懶得學新東西? 還是語言能力不足,只能等別人翻譯? 你有沒有考慮過生產力、可維護性、未來發展性等等可能? 還是只是單純覺得程式寫出來能跑就好? 你真的有檢討過你目前用的工具到底有哪些缺點嗎? 你有試著去找其它解決方案嗎?

    好,就算是我自己的問題,那同樣一個人的資質,時間的投入,我們這樣來算好了

    Q = 使用者資質
    T = 投入時間
    R = 工具品質系數 (包括學習曲線、資源等等)

    那你投資在一樣工具上的報酬就是 = Q*T*R

    很明顯的是,就算同樣資質、同樣時間投入,工具的品質影響到你的報酬,包括生產力、開發成本、維護成本等等

    假設PHP-CGI的工具品質系數是0.5,那如果我們能找到一個工具X,它的工具品質系數是1,那你的報酬差別就是2倍….

    為什麼我要去投資一個報酬率比較低的工具? 當然這公式把問題簡化了很多,資質和工具品質與報酬間的關系未必會是線性的,但是我想表達的就是一個工具的品質影響到你得到的報酬

    與其用一個爛工具整天罵心情不好、浪費時間在工具的缺陷上,生產力因此而很低,你如果把這些視為瓶頸,那你可以這輩子就只學PHP就可以了,因為反正出問題都只是你自己的瓶頸,我寧可去花時間找其它更好的解決方案

    這有篇文章是講RackSpace從使用PHP開發糟遇困難到轉而使用Python的案例,如果你說那也是個人的瓶頸,那我也不知道要說啥好= =|||
    http://python.org/about/success/rackspace/

  30. FlyingHail 說道:

    從某些方面講 php是很爛,不過說到底它爛是爛在太自由了,一個合格的程序員和一個玩票的代碼玩家都能寫出一樣的功能,但是代碼質量大相徑庭。

    這個問題在JavaScript上更嚴重。最直接的看看jQuery這個赫赫有名的JS庫1.3、1.4.1和1.4.2的執行速度,每個和前一個比都能速度翻倍….

    不過問題都是能解決的,就看你是不是要做,一些語言更好,是因為它本身就做了framework的事情。特別是ruby on rails,rails 不就是個framework么。問題的根本不在於語言是不是好,而在於你想不想把它做好。

    至於投入產出比。這個不應該是由我們來決定的,應該是由項目負責人來考量。現實情況總是複雜的不是么。不過說起來學習一個你已經掌握的語言的框架總比學習一個新的語言投入要少吧。

    最後,Magic quote默認的確是打開的,但是從PHP4.4開始之後的版本Magic quote在“建議”配置裏面都是關閉的。PHP5.3只給了兩個php.ini的例子(開發和發佈環境),全是關閉的。然後就是看PHP6了….

  31. victor 說道:

    @FlyingHail:

    我個人是這樣覺得,上面提到的PHP問題是否都能解決? 當然都可以,PHP是open source的專案,最糟的情況就是自己下去改source,我們在使用各種工具,像我在用TurboGears2,也有些問題得解決,這時我就得寫workaround,例如i18n的language自動選擇的bug,所以終究問題都能解決的,這點是沒錯的

    但是問題能否解決是0和1的答案而已,現實是,你解決的是什麼方面的問題? 有多少問題要解決? 解決這些問題得花多少時間? 舉個例子,我以前寫的文章系統,沒有用到任何SQL,只用文字檔來存文章,但是我得另外寫個filter函數來解決magic quote escape掉的字元,這就是真正重點所在,我花了多餘的心力在無關的東西上,而PHP的缺陷導至有很多這類的問題可以讓你花很多時間去找文章解決,unicode、memory leak等等,而當你找到解決方案時,如同我在文章裡面提到的引言,這時候你腦子裡出現一個問號,想』既然你可以在網路上找到解決方案? 為什麼這些問題到現在還沒被修正?』,當然一個專案改變影響到越多人,在改版時就得越小心,PHP正因為他竄紅太快,也因為他很多設計都只為了門檻低,所以這樣的天性是必然的,相對的像其它一開始都是小眾的語言,因為不像PHP那樣極速暴紅,所以改版負擔較少,自然可以朝較好較正確的方向改版,PHP的改版歷史可以看見一路都是在為了入門者,討好各方的使用者,從< % %>就可以看出它是為了討好ASP使用者,諸如此類的設計也隨處可見

    當然,學習一款新的語言總比使用現有的來得花時間,但是我說過那是一種投資,你當初學PHP不也是一種投資嗎? 既然是投資,我看見的不只是現在,還有未來,未來新的網頁開發技術越來越成熟,選擇非PHP的選擇很多可以一口氣解決一堆既有的問題,你買不買單? 像是Unicode,在Python下寫再簡單也不過了

    u’中文’.encode(‘utf8′)
    或是
    ‘中文’.decode(‘utf8′)

    一個encode和一個decode就可以解決,但PHP現在支援的unicode還是零零落落的….,這還只是問題之一而已,PHP選擇極速成為熱門,自然有他的原罪在,做為投資的選擇,我寧願多花點時間學習其它有經過仔細設計和思量的語言,對於未來也有較好的發展

發表迴響