PHP原始碼分析之等於操作符( )

2021-09-14 06:38:17 字數 2975 閱讀 8571

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,同時看到==所對應的opcodezend_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 次 每...