【PHP】これで分かる関数! – 関数の構文・引数 –

PHP

更新履歴

更新日更新者更新内容
2021/8/17JJIサンプルプログラムの実行結果に画面の画像を追加

引数

関数に渡す引数(パラメータ)として知っておいた方がよいことは次の通りです。

項目説明
値渡し値渡しは、関数の引数を$varの形式で渡す
関数内で引数の値を変更しても呼び出し元には影響を与えない
リファレンス渡し参照渡しとも呼ばれる
関数の引数を&$varの形式で渡す
参照渡しの場合、関数内で引数の値を変更した場合、
呼び出し元の変数の値も変更される
デフォルト引数引数の値が渡されない場合、使用される初期値のこと
可変長引数引数を指定された数ではなく、好きな個数を渡せる形式
名前付き引数PHP8.0から導入された引数を渡す形式
引数を名前付きで渡すことができるため、関数の引数を
指定された順で渡さなくてもよい

値渡し

値渡しは、関数の引数を次のような形式で渡します。
関数の引数は値渡しを使用することが一般的な方法です。
値渡しの場合、関数内で引数を変更しても呼び出し元の変数は影響を与えることはありません。

function foo(int $num) {
    ・・・
}

サンプルプログラム

実際のサンプルプログラムを見た方が早いと思うので載せておきます。
値渡しの場合、関数内で引数を変更しても呼び出し元は変更されないことが分かります。

<?php
    // 引数の値への厳密な型付け
    declare(strict_types = 1);

    echo "【PHP】関数<br>\n";
    echo "【引数】値渡し<br>\n";

    $num = 5;
    echo '関数の呼び出し前:$num:' . $num . ":<br>\n";
    echo '関数の戻り値:$num:' . count_5up($num) . ":<br>\n";
    echo '関数の呼び出し後:$num:' . $num . ":<br>\n";

    function count_5up(int $num) :int {
        $num = $num + 5;
        return $num;
    }
?>

実行結果は次の通りです。

・画面

・HTML

【PHP】関数<br>
【引数】値渡し<br>
関数の呼び出し前:$num:5:<br>
関数の戻り値:$num:10:<br>
関数の呼び出し後:$num:5:<br>

参照渡し

参照渡しは、関数の引数を変数前に&をつけて渡す方法です。
参照渡しの場合、関数内で引数の値を変更した場合、呼び出し元の値も変わります。
ただし、関数の戻り値、オブジェクトが使用できるため、参照渡しはあまり使用しないと思います。

function foo(int &$num) {
    ・・・
}

サンプルプログラム

実際のサンプルプログラムを見た方が早いと思うので載せておきます。
参照渡しの場合、関数内で引数を変更した場合、呼び出し元も変更されていることが分かります。

<?php
    // 引数の値への厳密な型付け
    declare(strict_types = 1);

    echo "【PHP】関数<br>\n";
    echo "【引数】参照渡し<br>\n";

    $num = 5;
    echo '関数の呼び出し前:$num:' . $num . ":<br>\n";
    count_ref_5up($num);
    echo '関数の呼び出し後:$num:' . $num . ":<br>\n";

    function count_ref_5up(int &$num) :void {
        $num = $num + 5;
    }
?>

実行結果は次の通りです。

・画面

・HTML

【PHP】関数<br>
【引数】参照渡し<br>
関数の呼び出し前:$num:5:<br>
関数の呼び出し後:$num:10:<br>

デフォルト引数

デフォルト引数は関数の引数を渡さない場合に使用される初期値のことです。
PHPのデフォルト引数には次のような特長があるので、使用する際は注意してください。

複数のデフォルト引数が指定されている場合、全てのデフォルト引数を渡さないと引数の左から順に値を渡される動作になっている。
そのため、デフォルト引数を意識し、引数を渡す必要がある。

サンプルプログラム

上記の注意を含めてデフォルト引数のサンプルプログラムを載せておきます。

<?php
    // 引数の値への厳密な型付け
    declare(strict_types = 1);

    echo "【PHP】関数<br>\n";
    echo "【引数】デフォルト引数<br>\n";

    // デフォルトの引数が1つの場合
    output1();              // 引数指定なし
    output1("ワールド");    // 引数指定あり

    // デフォルトの引数が複数の場合
    output2();                  // 引数指定なし
    output2("world");           // 引数を1つ指定する場合、左の引数が変わる
    output2("Hello", "world");  // 引数を全て指定する

    // デフォルトの引数あり、なしが混在の場合
    // output3();                          // 引数を渡さない場合、指定不可
    output3("デフォルト引数なし");          // 引数を1つ渡す場合
    output3("全ての引数指定", "world");     // 引数を全て渡す

    // デフォルト引数が1つの場合
    function output1(string $param1 = "ハロー") :void {
        echo '$param1:' . $param1 . ":<br>\n";
    }

    // デフォルトの引数が複数の場合
    function output2(string $param1 = "ハロー", string $param2 = "ワールド") :void {
        echo '$param1:' . $param1 . ': $param2:' . $param2 .  ":<br>\n";
    }

    // デフォルトの引数あり、なしが混在の場合
    function output3(string $param1, string $param2 = "ワールド") :void {
        echo '$param1:' . $param1 . ': $param2:' . $param2 .  ":<br>\n";
    }
?>

実行結果は次の通りです。

・画面

・HTML

【PHP】関数<br>
【引数】デフォルト引数<br>
$param1:ハロー:<br>
$param1:ワールド:<br>
$param1:ハロー: $param2:ワールド:<br>
$param1:world: $param2:ワールド:<br>
$param1:Hello: $param2:world:<br>
$param1:デフォルト引数なし: $param2:ワールド:<br>
$param1:全ての引数指定: $param2:world:<br>

可変長引数

PHPでは、関数の引数は固定の数ではなく、任意の数で指定することもできます。
引数を任意の数だけ指定できることを、可変長引数と呼び、次のように指定します。

function foo(...$var) {
    ...
}

可変長引数の前に引数を指定することもでき、その場合は次のように書きます。

function foo($param, ...$var) {
    ...
}

このブログで書いているサンプルプログラムでも何回出ているPHP標準のprintf()関数も可変長引数をもつ関数です。
printf()関数の詳細は次のPHPマニュアルに詳しく書いていますので、見てください。

PHP: printf - Manual

サンプルプログラム

可変長引数のサンプルプログラムを載せておきます。

<?php
    // 引数の値への厳密な型付け
    declare(strict_types = 1);

    echo "【PHP】関数<br>\n";
    echo "【引数】可変長引数<br>\n";

    echo "可変長引数のみ:" . sumarize_number(1,3,5,7,9) . ":<br>\n";
    // こういう使い方もできるが、分かりにくいので使用しないと思う
    echo "通常引数の関数:" . add_number(...[10,11,12]) . ":<br>\n";
    echo sumarize_number2("通常+可変長引数混在:", 2,4,6,8,10) . ":<br>\n";

    // 可変長引数のみ
    function sumarize_number(int ...$params) :int {
        $num = 0;       // 数値
        $sum = 0;       // 合計

        // ループで可変長引数より取り出し、加算
        foreach($params as $num) {
            $sum = $sum + $num;
        }

        return $sum;
    }

    // 通常引数の関数
    function add_number(int $param1, int $param2, int $param3) :int {
        return $param1 + $param2 + $param3;
    }

    // 通常引数+可変長引数
    function sumarize_number2(string $val, int ...$params) :string {
        $num = 0;       // 数値
        $sum = 0;       // 合計

        // ループで可変長引数より取り出し、加算
        foreach($params as $num) {
            $sum = $sum + $num;
        }

        return $val . strval($sum);
    }
?>

実行結果は次の通りです。

・画面

・HTML

【PHP】関数<br>
【引数】可変長引数<br>
可変長引数のみ:25:<br>
通常引数の関数:33:<br>
通常+可変長引数混在:30:<br>

名前付き引数

このブログでは、PHPのバージョンは7.4を扱っています。
名前付き変数はPHP8.0以上から対応しているため、現状は取り上げません。
このブログがPHP8.0に対応した後、内容を書こうと思います。

コメント