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); } /* }}} */ ```