PHPの関数はどのように実装されているのか
2024/02/03
※PHP8.2の実装です。
例として、整数型の除算を行う`intdiv()`の実装を見てみます。関数が定義されているファイルは[/ext/standard/math.c](https://github.com/php/php-src/blob/PHP-8.2/ext/standard/math.c#L1199)です。ざっくり読んでみると、分母が0などの異常な値の場合は例外が投げられ、分母分子が正常な値の場合はC言語での除算が行われその結果が返されています。
```c
/* {{{ Returns the integer quotient of the division of dividend by divisor */
PHP_FUNCTION(intdiv)
{
zend_long dividend, divisor;
ZEND_PARSE_PARAMETERS_START(2, 2)
Z_PARAM_LONG(dividend)
Z_PARAM_LONG(divisor)
ZEND_PARSE_PARAMETERS_END();
if (divisor == 0) {
zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Division by zero");
RETURN_THROWS();
} 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_THROWS();
}
RETURN_LONG(dividend / divisor);
}
/* }}} */
```