不喜歡 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 |