2008年11月7日星期五

PHP不是首選的Language

記得10年前左右我學VB6時,很多人說VB6學壞手勢,話學Delphi好,當然呢o的已經係歷史話題。但前排睇左幾篇Blog文,話PHP是次選語言,不會是初學者的首選,我都很同意,亦令我想起"學壞手勢"呢四隻字。

PHP的問題,其實在於太過寬鬆,好似近排我工作上是寫PHP就有很多令我出奇的情況。
疑問1:
<?php
$_SESSION['info_1'] = "1"; // assign value
$_SESSION['info_2'] == "2"; // compare value
?>

第一個Session很正常,只是assign "1"給info_1 ,但第二個Session沒出現Error卻很奇怪,不論是true或false,起沒有主體或不是condition情況下,卻Syntax成立,如果不小心打多一個"="符號,整個程式就已經錯誤。

疑問2:
<?php
$select = "SELECT login_id FROM user";
$rs = mysql_query($select);
$row = mysql_fetch_assoc($rs); //data reader pointer 在第一行
echo $row["login_id"]; //output : sam
// 100行code後
$select_pwd = "SELECT password FROM user";
$rs_pwd = mysql_query($select_pwd);
$row = mysql_fetch_assoc($rs_pwd); //示範:忘記之前已經使用$row
echo $row["password "]; //output password string: ASj89qa
?>

這段Code看似沒有問題,只是重用變數,但我卻奇怪為什麼PHP不搞好少少,雖然$row只是in-memory的data集合,但不論JSP或ASPX,這類DataReader/Datatable已經是一個物件,不用New而且在沒有關閉的情況下可以重用有點怪怪.(例如.NET datareader都要進行DataReader.Close() ; DataTable只要結構和第一次不同,都要重構一次。

疑問3:
Include/Require無限Loop...這個是人為問題,很多PHP程式都是這樣,鐘意Include library,function,variable,但Include之中再Include,多層Level的引用Class方式,我卻覺得只會一個亂字,雖然很多IDE可以Open Declaration,但係呢種手法我真係不感恭維。而且不同Folder,層層疊疊下真係頭都暈。
C.php有Function C
B.php include C.php 用Function C
但又會有A.php include B.php去Call function C.....

疑問4:
$varInt = 1;
$varString = "2";
echo $varInt.$varString; //Output : 12 (OMFG~)

全部都係是Dynamic Type,PHP不用設Data Type,無論你是什麼類型,都可以用於一個Variable上,但這正是"學壞手勢"的根源。為什麼一個看似Int的類型可以和String結合,這是不可能發生在C#上的。

其實還有很多奇怪地方都是出自PHP語法太過flexible,當然有好有唔好,好既就係可以好快咁寫到一個網頁程式,唔好既就係潛移默化了一些錯誤的觀念。

有幾個好網,很值得一睇,更加深入講解點解PHP不是一隻首選Langauge。
PHP ‘Good’ Practices
http://rubayeet.wordpress.com/2008/08/27/php-good-practices/
A simple ‘Gotcha’ in PHP
http://rubayeet.wordpress.com/2008/04/29/a-simple-php-gotcha/
PHP is a good second programming language(but never a first)
http://rubayeet.wordpress.com/2008/05/10/php-is-a-good-second-programming-language/
Is PHP a good first language?
http://codeutopia.net/blog/2008/05/01/is-php-a-good-first-language/

6 則留言:

  1. PHP 的本身就是為 Web 設計,比較取向於 script 型~
    要學 strong type 的 language 自然不會學 PHP

    dynamic type language 近年也冒起得很快, javascript、ruby 等等, 其中 closure 的應用可說是主因吧?

    記憶中 PHP 也有 Web Framework 可以用 (Cake?),在框架下可能沒那麼亂 (但就要受限制)

    回覆刪除
  2. php is script language whereas java/dot net is programming language. php focus on "one-end" development whereas other language has advantage on development required "maintenance"

    回覆刪除
  3. 針對你的問2,PHP的物件始終太"新"(對我呢D老鬼來講),所以好多時都只係一個array就標示出來。
    另外,要關閉也有方法,mysql_free_result($rs) 不就解決了嗎?當然,我自己都唔會寫呢句野關閉。

    PHP係一種好有個性的HTML embed scripting language,就係因為太有個性,所以難登大雅之堂。以我自己為例,用PHP都有八年,最多只係知道D野用來做乜,管他結構唔結構。而家幫人做大野,都只會選擇J2EE+JSP 而不用PHP......

    回覆刪除
  4. 認同你說PHP不應是first language,不過見你出疑題考大家,就嘗試解答你的問題:
    1) PHP是scripting language,在這裏抄了Perl,statements可以有side-effect,例如你第二句可以寫成 $_SESSION['info_2'] == "2" or die;,如果info_2不是等於2 (不論任何type),就會行後面果句。
    2) 你用的是PHP最基本的MySQL functions,並不是OO的!所以mysql_fetch_assoc只是return array,可以不斷return新的array然後你用同一個variable裝,就是可以嘛。如果你要OO要有object的,可以考慮用mysqli或者其他PHP libraries。
    3) 如果你是develop或使用PHP libraries,是declare一些functions等等,是應該用include_once或者require_once,如果你是要作inline運行,則每次加上include或者require。
    4) 哈哈,我見到都覺辛苦,不過就是PHP為咗flexibility而採用了duck typing,不過是否unsafe就另一回事了。

    回覆刪除
  5. 100% agree. Well, but I think PHP is a scripting language. That is not a complete programming lanuage.
    I recommend Java and C# for students.

    回覆刪除
  6. thanks for your sharing!!!!!

    回覆刪除