PHP - 関数(function)

公開日:2020-12-22 更新日:2020-12-22
[PHP]

1. 概要

これまでに print() や var_dump() などの関数が使ってきましたが、
次のようにして、関数を自分で実装することもできます。
function 関数名(引数1, 引数2, ・・・, 引数n) {
  処理;
  return 戻り値;
}

引数や戻り値は、必要がなければ指定しなくてかまいません。
function 関数名() {
  処理;
}

関数の実行方法(呼び出し方)は、通常の関数と同じです。
関数の中の処理は、呼び出された時に実行されます。
//引数なし
関数名();

//引数あり
関数名(引数1, 引数2, ・・・, 引数n);

//戻り値あり
$result = 関数名(引数1, 引数2, ・・・, 引数n);

2. 処理の順序

プログラムは上から順番に実行されますが、関数の定義の段階では、関数内の処理は実行されません。

次に、関数が呼び出されると(使われると)、関数の中に処理の流れが移行します。
そして、関数の処理が終わると、関数の呼び出し元に戻ります。
print("1\n");

//関数の定義
function test() {
    print("test()\n");
}

print("2\n");

//関数の呼び出し
test();

print("3\n");
実行結果
1
2
test()
3

3. 加算する関数の実装

function add($v1, $v2) {
  $result = $v1 + $v2;
  return $result;
}

var_dump( add(1, 2) );
実行結果
int(3)

4. 引数に配列を指定

引数には、配列を指定することもできます。
次の例では、配列の全要素の値の合計を算出します。
function sum($values) {
    $result = 0;
    foreach ($values as $value) {
        $result = $result + $value;
    }
    return $result;
}

$ary = [1, 2, 3, 4, 5];
$result = sum($ary);
var_dump($result);
実行結果
int(15)

5. 引数のデフォルト

引数が指定されていない場合は、引数にデフォルト値を設定することができます。
次の例では、関数を呼び出す時に、2番目の引数を指定しても、指定しなくても動作します。
function implode2($ary, $delimiter = ',') {
  $result = '';
  foreach ($ary as $s) {
    $result = $result . $delimiter . $s;
  }

  //先頭の1文字を削除
  $result = substr($result, 1);

  return $result;
}
$ary = ['a', 'b', 'c', 'd', 'e'];
var_dump( implode2($ary) );
var_dump( implode2($ary, '-') );
実行結果
string(9) "a,b,c,d,e"
string(9) "a-b-c-d-e"

6. 可変長引数

引数を「...変数名」とすると、渡された数だけ引数を受け取ることができます。
渡された引数は、配列に入ります。
function sum(...$values) {
    $result = 0;
    foreach ($values as $value) {
        $result = $result + $value;
    }
    return $result;
}

$result = sum(1, 2, 3, 4, 5);
var_dump($result);
実行結果
int(15)

また、「...」を使うと、配列を変数に展開することもできます。
function add($v1, $v2, $v3) {
    return $v1 + $v2 + $v3;
}

$ary = [1, 2, 3];
$result = add(...$ary);
var_dump($result);
実行結果
int(6)

7. 引数と戻り値の型

引数の変数名の前に型を付けると、その型以外の値が渡って来た場合に、エラーにすることができます。
また、戻り値の型は、関数名の()の後ろに、「:型」として指定します。
return で異なる型の値を返すとエラーになります。
function add(int $v1, int $v2):int {
    $result = $v1 + $v2;
    return $result;
}

var_dump(add('abc', 2));
実行結果。エラーが発生する。
Fatal error: Uncaught TypeError: Argument 1 passed to add() must be of the type int, string given

8. 複数の戻り値を返す

[ ] を使うと、配列の各値を、複数の変数に代入することができます。
これを利用して、関数の戻り値を配列にすると、次のように戻り値を複数取得できます。
function test() {
    return [1, 2, 3];
}

//list($a, $b, $c) = test();
[$a, $b, $c] = test();
print($a . "\n");
print($b . "\n");
print($c . "\n");
実行結果
1
2
3

9. 参照渡し

引数に「&」を付けると、値ではなく、呼び出し元の変数がそのまま渡されます。
関数内では変数名が変わりますが、実体は同じため、値を変更すると、呼び出し元の値も変わります。
「&」を付けた場合と付けない場合の結果を確認してみてください。
function increment(&$v) {
    $v = $v + 1;
}

$a = 0;

increment($a);
var_dump($a);

increment($a);
var_dump($a);
実行結果
int(1)
int(2)
PHP は他の言語の参照渡しと、微妙に動作が異なるため、注意が必要です。
例えば他の言語では、参照渡しの変数に対して、関数内で代入をすると、
変数に入っていた実体が別の値に置き換わり、
呼び出し元の変数が影響を受けなくなる場合があります。

また、配列を参照渡しにする場合、他の言語では自動的に参照渡しになる場合がありますが、
PHPの場合は「&」を付ける必要があります。
但し、オブジェクトは「&」を付けなくても、参照渡しになります。

10. 関数から外の変数の参照

関数の中から外の変数を参照する場合は、
global で参照する変数を指定する必要があります。

$value = 100;
function getValue() {
    global $value;

    return $value;
}

var_dump( getValue() );
実行結果
int(100)