標籤:

不喜歡 PHP 的兩個點

從大二上學期開始接觸 PHP,被這門語言的簡單粗暴所折服。PHP 的爽點很多,比如弱類型,比如包打天下的數組。寫 PHP 代碼幾乎可以不用動腦的堆徹,所以在我少不經事的時候,我甚至說出過 「寫代碼無非是體力活動」這樣大言不慚的話。

隨著對 PHP 了解的深入,爽點慢慢退去,不滿慢慢產生,說兩個,一個是弱類型,一個是IO。

PHP 的弱類型

先說弱類型,了解過 PHP 內核的同學們都知道,這門語言用一個 _zval_struct 表示一切數據類型。在 PHP5 的時代,它是這個樣子的:

struct _zval_struct {nn union {nn long lval;nn double dval;nn struct {nn char *val;nn int len;nn } str;nn HashTable *ht;nn zend_object_value obj;nn zend_ast *ast;nn } value;nn zend_uint refcount__gc;nn zend_uchar type;nn zend_uchar is_ref__gc;nn};n

它包含了一個type欄位, 表示這個zval存儲的是什麼類型的值, 可能選項有 IS_NULL, IS_LONG, IS_STRING, IS_ARRAY, IS_OBJECT 等等。弱類型給這門語言帶來的巨大優勢就是使用起來巨爽無比,變數既不用聲明也不用限制類型,極大降低了入門門檻,還給人拿起鍵盤就是懟的快感。

BUT,讓你爽也是要你付出代價的。在前東家的時候,曾經就被弱類型坑過,比如這樣的代碼 if ($result == false),當 result 取 0 是一個合法的邏輯。在這種情況下,需要用 === 運算符。

這個例子還好,現在代碼中也習慣性使用 === 了。不過,我還可以說一個更慘絕人寰的例子:

有如下的代碼:

$arr = [foo, bar];nnecho in_array(0, $arr);n

返回結果是…… true。原因就在於類型轉換,in_array 默認使用 == 運算符,字元串在程序運行中被強制轉換成int形,變成了0。如果使用in_array函數的時候想加上類型限制的話,就需要加上第三個參數了,in_array($value, $arr, true)

(:其實這題也是個面試暖場題,去年在新浪被面的。

(:鏈家的面試暖場題也很有意思,比如:你知道多少種在數組中查找某個特定值的函數,他們的效率如何

PHP 的 IO

在業務日漸複雜的情況下,IO 就成為需要考慮的問題了,不管是網路 IO 還是文件 IO,PHP 一視同仁簡單粗暴的 BIO。比如說在 PHP 中如果打開一個文件,整個進程或線程(取決於當前伺服器使用了哪種模型)都要 block 在那兒等待 IO 的返回。如果是 Node 的話,你只要註冊好回調函數就好了,計算機在 IO 返回前可以做更多的工作,比如建立更多的連接,IO 返回後程序將按照註冊好的函數繼續執行。

在前東家的時候,也順手寫過 Nodejs(捂臉笑),當時看著金字塔一樣的回調整個人都方了,也對什麼 IO 密集型業務不甚了解。現在越來越覺得這是個可以好好優化的點。

在 PHP 生態圈裡,Swool 在這方面做了很多貢獻,很慚愧,我還沒有了解過 Swool 的具體實現,希望自己下班後更努力吧。


在高鐵上很是無聊,隨手看了本 JAVA 的書,我想寫 JAVA。

推薦閱讀:

與nodejs相比,php有啥優勢?
為什麼突然出現大規模黑php風潮?
通過非常規手段添加PHP後門

TAG:PHP |