Menu

PHPの関数:定義、戻り値、引数、型宣言

PHPの関数はfunction name($param) { return $value; }で定義します。戻り値、デフォルト引数、名前付き引数、参照渡し、strict_typesを使った型宣言、null許容型とunion型、可変長引数...$argsを学びます。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

PHPの関数は、functionキーワード、名前、引数リスト、本体で定義し、returnで呼び出し元に値を返します。function add(int $a, int $b): int { return $a + $b; }で定義し、add(2, 3)で呼び出すと5が返ります。

引数の前のstringとintは型宣言で、括弧のあとの: stringは戻り値の型です。どちらも任意ですが、ミスを早めに見つけ、関数が何を期待しているかを示してくれます。

戻り値と複数の値を返す方法

returnは関数をすぐに終わらせます。returnのない関数や、値なしのreturn;はnullを返します。効果のためだけに呼ぶ関数には: voidを宣言します。関数が返す値は1つですが、その値を配列にして、呼び出し側で分割代入できます。

[...] =のほかの形は分割代入を参照してください。

デフォルト引数と名前付き引数

= valueを付けた引数は任意で、呼び出し側は省略できます。任意の引数は必須の引数のあとに置きます。PHP 8.0以降は名前付き引数を使えば、呼び出し側が任意の引数を名前で渡せるので、不要な任意の引数を飛ばせます。

名前付き引数は組み込み関数の呼び出しも読みやすくします:str_pad('7', 3, '0', pad_type: STR_PAD_LEFT)。引数名は関数の公開インターフェースの一部になるので、引数名を変えると名前で呼んでいる呼び出し側が壊れることがあります。

参照渡し

PHPは通常、各引数のコピーを渡すので、関数は呼び出し元の変数を変更できません。引数の前に&を付けると、変数そのものが渡されます。sort()のような組み込み関数はこの方法で動いています。

たいていは、引数を変更するより新しい値を返すほうがわかりやすいコードになります。関数が本当に何かをその場で変更するためのものであるときに、参照を使いましょう。

型宣言とstrict_types

デフォルトでは、PHPは可能なら引数を宣言された型に変換します。add("5", 3)は"5"を5に変えます。ファイルのいちばん先頭にdeclare(strict_types=1);を書くと、そのファイルでの呼び出しではこの変換が無効になり、間違った型は変換されずにTypeErrorが投げられます。

declareの行がなければ、同じ呼び出しは8と出力します。"five"のような数値でない文字列は、どちらのモードでもTypeErrorを投げます。

引数と戻り値に宣言できる型は次のとおりです。

neverは、常に例外を投げるか終了する関数の戻り値の型です。クラス名やインターフェース名も型として使えます。

...$argsで可変個の引数を受け取る

...$numbersは、任意の数の引数を配列に集めます。呼び出し側で同じ...を使うと、配列を別々の引数に展開します。

関数の中で外側の変数を使う

関数には独自のスコープがあります。外側で定義した変数は中からは見えず、JavaScriptから来た人は驚くところです。

<?php
$taxRate = 0.2;

function priceWithTax(float $price): float
{
    return $price * (1 + $taxRate);   // $taxRate is undefined here
}
Warning: Undefined variable $taxRate in /path/to/index.php on line 6

そして関数は税抜きの価格を返します。代わりに値を引数として渡しましょう。そうすれば関数が何に依存しているかがはっきりし、テストもしやすくなります。

globalキーワードでも動きますが、依存関係を隠してしまいます。これについては変数のスコープで扱っています。array_map()のコールバックのように、ほかの関数に渡す短い関数については、useで外側の変数を取り込める無名関数を参照してください。

よくある質問

PHPで関数を定義するには?

functionキーワード、名前、括弧の中の引数、本体を書きます:function add(int $a, int $b): int { return $a + $b; }。add(2, 3)で呼び出します。関数名は大文字小文字を区別せず、ファイルのトップレベルで定義した関数は、定義した行より前で呼び出せます。

PHPの関数から複数の値を返すには?

配列を返して分割代入します:function minMax(array $a): array { return [min($a), max($a)]; }としてから[$min, $max] = minMax([3, 1, 4]);。名前付きの結果なら、連想配列を返して['min' => $min] = ...を使います。

declare(strict_types=1)は何をしますか?

そのファイルから行う呼び出しで型の自動変換を無効にするので、intの引数に"5"を渡すと、5に変換されずにTypeErrorが投げられます。ファイルのいちばん最初の文である必要があり、そのファイルにだけ効きます。

PHPの名前付き引数とは何ですか?

PHP 8.0以降、引数を引数名で渡せます:htmlspecialchars($s, double_encode: false)。位置で渡す引数のあとなら任意の順番で書け、変えたくない任意の引数を飛ばせます。

PHPで変数を参照渡しするには?

引数の前に&を付けます:function addOne(int &$n): void { $n++; }。すると関数は呼び出し元の変数を変更します。&がなければPHPはコピーを渡し、呼び出し元の変数は変わりません。

Coddyのプログラミング言語のイラスト

Coddyでコードを学ぼう

始める