2009年2月19日 星期四

PHP的小小抽象滲漏

關於什麼是抽象滲漏請看這裡

1.Firefox的自動reload


在未指定字碼而且實際字碼與Firefox的預設不同時,
Firefox會先讀入一次,判斷目前所使用的字碼不對,
然後再跟Server要一次資料。所以PHP之類的CGI會被執行兩次。
所以,網頁請寫好Content-Type的header。
(什麼,你說這不是理所當然的嗎?
嗯,的確是,不過我現在程式還在寫內部部分還沒要處理UI,
這部份隨便寫寫結果就中招了。)

順帶一提IE不會這樣。他會直接用亂碼印出來。


2.empty的抽象滲漏


##ReadMore##
PHP的empty()只能拿來判斷變數。
如果你拿它來判斷函數回傳,他會給你一個錯誤訊息。
到這邊都很正常。

不過PHP 5.x開始多了個類別的method,叫__set跟__get。
__get的功用是他會在找不到member時以這個method去找資料。
比如說如果變數實際上沒有$t->num,他就會去呼叫$t->__get('num')。

實際上來說,這兩個就只是語法上的甜頭就是了,
因為一般使用上可以自己寫兩個函式,比如說Set()跟Get()來做同樣事,效果一樣。
好處只是,你可以寫$t->num++而不是$t->Set('num', $t->Get('num')+1)。

問題出在於,當你empty($t->num)時。
假設$t->str會回傳字串,而你想要判斷這是不是個空字串,
他不會照你預期的回傳,也不會有錯誤訊息。
就算字串有東西,他會照樣回傳true。
而你就字面上看,empty($t->str)怎麼看都沒有問題。

順帶一提strcmp($t->str, "")===0也一樣會出錯。
我最後成功時是使用strlen($t->str)===0。

供參考。

沒有留言: