記得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/