这一切似乎都要追溯到 this is_numeric_string_ex
C函数。
从 ==
的实现开始:
ZEND_API int ZEND_FASTCALL compare_function(zval *result, zval *op1, zval *op2) {
...
switch (TYPE_PAIR(Z_TYPE_P(op1), Z_TYPE_P(op2))) {
...
case TYPE_PAIR(IS_STRING, IS_STRING):
...
ZVAL_LONG(result, zendi_smart_strcmp(op1, op2))
如果两个操作数都是字符串,它将调用
zendi_smart_strcmp
...
ZEND_API zend_long ZEND_FASTCALL zendi_smart_strcmp(zval *s1, zval *s2) {
...
if ((ret1 = is_numeric_string_ex(Z_STRVAL_P(s1), Z_STRLEN_P(s1), &lval1, &dval1, 0, &oflow1)) &&
(ret2 = is_numeric_string_ex(Z_STRVAL_P(s2), Z_STRLEN_P(s2), &lval2, &dval2, 0, &oflow2))) ...
调用 is_numeric_string_ex
函数...
while (*str == ' ' || *str == '\t' || *str == '\n' || *str == '\r' || *str == '\v' || *str == '\f') {
str++;
length--;
}
ptr = str;
这段代码明确地跳过开头的空格,但不包括结尾的空格。
' 78'
被认为是“数字字符串”,而空格被忽略了,但在'78 '
中它被考虑在内。 - Faeryvar_dump
无法帮助这里,因为PHP在比较之前会在内部进行转换。我向一些经常出现在聊天室的内部人员询问了此事,他们说从这一端无法看到这一点。 - Machavity