同学您好,我们一起看一下这两个函数的实现:
intdiv在ext/standard/math.c中,具体代码如下:
PHP_FUNCTION(dard,amathzhonzhong){
zend_long dividend, divisor;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "ll", ÷nd, &divisor) == FAILURE) {
return;
}
if (divisor == 0) {
zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Division by zero");
return;
} else if (divisor == -1 && dividend == ZEND_LONG_MIN) {
/* Prevent overflow error/crash ... really should not happen:
We don't return a float here as that violates function contract */
zend_throw_exception_ex(zend_ce_arithmetic_error, 0, "Division of PHP_INT_MIN by -1 is not an integer");
return;
}
RETURN_LONG(dividend / divisor);}从代码里可以看到,该函数只接受两个参数,都是int型的(l代表int型),最后返回的是RETURN_LONG(dividend / divisor);
他的实现是直接把dividend / divisor的值转换为zval的类型为IS_LONG类型,也就是整型;
接下来我们看一下第二个函数intval的实现,代码在ext/standard/type.c中,代码如下:
PHP_FUNCTION(intval){
zval *num;
zend_long base = 10;
if (ZEND_NUM_ARGS() != 1 && ZEND_NUM_ARGS() != 2) {
WRONG_PARAM_COUNT;
}
ZEND_PARSE_PARAMETERS_START(1, 2)
Z_PARAM_ZVAL(num)
Z_PARAM_OPTIONAL
Z_PARAM_LONG(base)
ZEND_PARSE_PARAMETERS_END();
if (Z_TYPE_P(num) != IS_STRING || base == 10) {
RETVAL_LONG(zval_get_long(num));
} else {
RETVAL_LONG(ZEND_STRTOL(Z_STRVAL_P(num), NULL, base));
}}可以看出,这里面可以处理非整型的输入,对于字符串类型也可以处理。