## 内部（ビルトイン）関数

PHPは標準で多くの関数と言語構造を持っています。また他にも コンパイル済みの特定のPHP拡張モジュールを必要とする関数があります。 それらはもしコンパイルされていなければ"undefined function（未定義の関数）" として致命的エラーを発するでしょう。例えば、 imagecreatetruecolor()のような 画像関数を使用するには、 GDサポートを有効にしてPHPをコンパイルしておく必要があります。 また、mysqli_connect()を使う場合もやはり MySQLiサポートを有効にしてPHPが コンパイルされている必要があります。 stringや variable関数のように どのバージョンのPHPでも含まれているコアの関数もたくさんあります。 phpinfo()やget_loaded_extensions()を コールすることで使用しているPHPにロードされている拡張モジュールを 見ることができます。また、多くの拡張モジュールはデフォルトで有効に なっており、PHPのマニュアルは拡張モジュール毎に分けられていることにも 注意してください。PHPのセットアップについては 設定, インストール,そして個々の拡張モジュール の項をご覧ください。

関数のプロトタイプに関する解説はマニュアルの 関数の定義を読むにはを 参照ください。関数の戻り値や引数が直接与えられた場合に どのように動くかを認識することは重要です。 例えば、str_replace()は変更された文字列を 返すのに対し、usort()は与えられた引数そのものを 変更します。マニュアルの各項にはそれぞれの関数に関する情報があります。 関数のパラメータ、振る舞いの変更、成功した場合失敗した場合の それぞれの戻り値、可用性に関する情報などです。 これらの重要な（時には微妙な）違いを知ることは、 正しいPHPコードを書くうえで極めて重要なことです。

> 注意: 関数へのパラメータとして関数が想定しているのとは異なるものを渡した場合、 例えば文字列を想定しているところに配列を渡した場合などの場合は 関数の戻り値は未定義となります。たいていの場合は `null` を返すでしょう。しかしこれはあくまでも規約にすぎず、 これに依存することはできません。 PHP 8.0.0 以降では、このような場合には TypeError をスローすることになっています。

> 注意:

> ビルトイン関数のスカラー型の引数には、 デフォルトの自動変換(coercive)モードの場合、 null を渡すことが出来ます。 PHP 8.1.0 以降では、 nullable として宣言されていない内部関数のパラメータに `null` を渡すことは推奨されなくなり、 自動変換モードでは警告が発生するようになっています。 ユーザ定義の関数においては、スカラー型の引数は nullable と明示的にマークする必要があり、その振る舞いと合わせるためです。

> たとえば、strlen() 関数はパラメータ `$string` に null でない文字列を渡すことを期待しています。 歴史的な理由により、 PHP は自動変換モードの場合に、 このパラメータに `null` を渡すことを許可してきました。 結果として、引数に `null` を渡すと暗黙のうちに文字列にキャストされ、 結果は空文字列 `""` になっていました。 これに対し、strict モードの場合は TypeError がスローされます。

>     <?php
>     var_dump(strlen(null));
>     // "Deprecated: Passing null to parameter #1 ($string) of type string is deprecated" as of PHP 8.1.0
>     // int(0)

>     var_dump(str_contains("foobar", null));
>     // "Deprecated: Passing null to parameter #2 ($needle) of type string is deprecated" as of PHP 8.1.0
>     // bool(true)

### 参考

- function_exists()
- 関数リファレンス
- get_extension_funcs()
- dl()

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open