ざっくりん雑記

プログラミングで忘れそうなことをひたすらメモる

PHP - 関数のパラメータ

関数を定義するとき、任意の値を引数(パラメータ)として渡すことができる。

渡す方法として、値渡し参照渡しがある。

値渡しのパラメータ

大抵の場合は、こちらを使う。引数には任意の式を指定でき、式の内容が評価された後の値が関数に渡される。

<?php

function greeting($name) {
    echo $name."さん。おはよう。";
}

$name = "azunobu";
greeting($name);

例として、こういったかたちで書ける。

参照渡しのパラメータ

参照渡しでは、通常のスコープの規則を無視し、関数内から直接変数の値を操作する。そのため、参照渡しではパラメータとして変数を渡す必要がある。 参照で渡す、ということを明示するには関数のパラメータリストの引数名の前にアンパサンド記号(&)を付ける。

<?php

function greeting(&$personName) {
    echo $personName."さん。おはよう。";
}

$name = "azunobu";
greeting($name);

この例では、関数内の$personNameは参照渡しで渡されているので、直接$nameを参照している。 そのため、値の変更も関数内で直接変更を加えることができる。

また、参照渡しの主な恩恵としては、変数をコピーする必要がない。PHPでは、値渡しを行うと関数を実行する前に値の内容のコピーを作成する必要がある。 長い文字列や大きなオブジェクトの場合、このコピーは大きなコストになり実行速度にも影響を与えかねない。 参照渡しはこの点、コピーをせず直接参照できるため有利。

可変パラメータ

関数のパラメータの数を可変にしたい、という時もある。 PHP5.6以降であれば、パラメータリストに ... トークンを含めることで、 その関数が可変長の引数を受け取ることを示すことができる。

<?php

function sum(...$numbers) {
    $total = 0;
    foreach ($numbers as $num) {
        $total += $num;
    }
    return $total;
}

echo sum(1, 2, 3, 4, 5, 6, 7, 8, 9);

出力結果は45となる。

タイプヒンティング

渡ってきたパラメータが特定のクラス(あるいは特定のクラスを継承したクラス)のインスタンスであるか?コールバック関数であるか?…というバリデーション的なことが可能。

この部分の説明に関しては、とても分かりやすく解説された記事があるため、こちらを紹介します。

dekokun.github.io

参考

プログラミングPHP 第3版

プログラミングPHP 第3版

PHP: ユーザー定義関数 - Manual

PHP: 関数の引数 - Manual

PHPでコールバック関数を利用する - Qiita