php 中不同型別的變數進行弱型別比較時,有其語言本身比較特殊的規則。本文就起比較規則,就其原始碼角度進行解釋。php-version:
5.3
參考: php.net
通過詞法分析/語法分析/利用vld檢視opcode,我發現 php 原始碼中,比較操作符實現的核心方法是詞法分析compare_function
,位於zend/zend_operators.c +1376
如上圖示,通過zend/zend_language_scanner.l +1201
詞法分析規則,得到==
對應的token
為:t_is_equal
語法分析
在zend/zend_language_parser.y
搜尋上一步得到的token
值,得到語法分析中呼叫生成opcode
的方法為:zend_do_binary_op
,同時看到==
所對應的opcode
為zend_is_equal
確定zend
執行時的函式
opcode
對應的呼叫函式實現於zend/zend_vm_execute.h
檔案中,在此檔案中搜尋zend_is_equal
得到如下的函式列表:
方法均以zend_is_equal_spec
開頭,名字字尾受==
兩個運算元的zval
型別影響,具體的型別可以通過vld
檢視,如:
猜測是左運算元的型別 + 右運算元的型別。
以上圖為例,左運算元型別為is_const
, 右運算元型別為is_cv
,則對應的處理方法應該是:zend_is_equal_spec_const_cv_handler
(注:這種確認handler
的方法只是經驗規則,還有待原始碼驗證)
以上的推測正確與否,不影響我們接下來的判斷,因為我們發現這些方法都會呼叫同乙個核心方法compare_function
,比較的規則就在這個方法中。通過看此方法原始碼,比較規則一目了然。
compare_function
方法原始碼如下:
其他各型別比較規則見於compare_function
原始碼
深入分析 Dart 集合操作符原始碼
上篇文章我們詳細介紹了有關 dart 集合操作符函式的基本使用,那麼這篇文章將會從原始碼角度,分析其內部原理。通過它你將會理解什麼是惰性迭代器。void foreach void f e element main join 以上面的例子為例。首先,需要明確一點,languages 內部本質是乙個 g...
PHP位操作符
這個涉及到系統底層,web開發中幾乎沒用到,知道下有這個東西就好了。底層的東西解釋總是簡單不了的。變數在記憶體中的存放都是二進位制數字。整數在32位系統上是占用4位元組,乙個位元組是8位,也就是32位,位運算就是位級的運算操作了。a b shift left 左移 將 a 中的位向左移動 b 次 每...
PHP位操作符
這個涉及到系統底層,web開發中幾乎沒用到,知道下有這個東西就好了。底層的東西解釋總是簡單不了的。變數在記憶體中的存放都是二進位制數字。整數在32位系統上是占用4位元組,乙個位元組是8位,也就是32位,位運算就是位級的運算操作了。a b shift left 左移 將 a 中的位向左移動 b 次 每...