PHP関数の引数徹底解説:値渡し・参照渡し・型宣言の基本
はじめに
PHPの関数は、呼び出し元のスクリプトから「引数(ひきすう)」という形で入力を受け取るように定義できます。引数は、関数名の後ろにある括弧( ) の中にカンマ区切りのリストとして記述します。なお、関数を呼び出す際には、定義された引数と同じ数の値を渡す必要がある点に注意しましょう。
PHPでは、次のような引数の渡し方がサポートされています。
- 値渡し(デフォルトの動作)
- 参照渡し
- デフォルト値を持つ引数
- 可変長引数(個数が不定の引数)
引数を受け取る関数(値渡し)
以下の例では、2つの仮引数を持つ関数を定義しています。PHPではデフォルトで引数は「値渡し」されるため、関数の引数はその関数内でのみ有効なローカル変数として扱われます。そのため、関数の中で引数の値を変更しても、関数の外側には影響しません。
この例では、関数内で $x の値を変更していますが、関数呼び出し後に $x の値を確認すると、元のまま変化していないことがわかります。
サンプルコード
<?php
function add($x, $y){
$x = $x + $y;
echo $x . "\n";
}
$x = 10;
$y = 20;
add($x, $y);
// 関数の外側では $x は元の値のまま
echo $x;
?>実行結果
30 10
配列を関数に渡す
次の例では、add() 関数が配列を引数として受け取るように定義されています。関数内部では foreach ループを使って配列の各要素を順番に処理し、合計値を計算しています。
サンプルコード
<?php
function add($arr){
$sum = 0;
foreach ($arr as $i){
$sum += $i;
}
echo "sum = " . $sum;
}
add(array(1, 2, 3));
?>実行結果
sum = 6
参照渡しで引数を渡す
通常、関数の引数には値そのものがコピーされて渡されます。そのため、関数内で引数の値を変更しても、外部の変数には反映されません。一方、「参照渡し」を使うと、関数内での変更が呼び出し元の変数にも反映されます。
参照渡しで値を受け取るには、仮引数の名前の前に &(アンパサンド) を付けます。
サンプルコード
<?php
function swap(&$x, &$y){
$t = $x;
$x = $y;
$y = $t;
echo "inside function x=$x y=$y\n";
}
$x = 5;
$y = 7;
echo "before calling function x=$x y=$y\n";
swap($x, $y);
echo "after calling function x=$x y=$y\n";
?>実行結果
before calling function x=5 y=7 inside function x=7 y=5 after calling function x=7 y=5
swap() 関数によって $x と $y の値が入れ替わっています。変数が参照渡しされているため、関数の外側でも変更後の値が反映されている点に注目してください。
型宣言(タイプヒント)
PHPは本来、動的型付け言語です。C/C++ や Java のように、変数を宣言するときに型を指定する必要はありません。しかし、関数の引数に型宣言を追加すると、誤ったデータ型が渡された場合にパーサー(PHPエンジン)がそれを検出できるようになり、バグの早期発見につながります。
構文
// 型宣言付きで関数を定義する
function myFunction(type $arg1, type $arg2){
..
..
}スカラー型(int、float、string、bool)をはじめ、array、クラス/インターフェイス名、iterable、object など、PHPの標準的なデータ型はすべて型宣言として使用できます。
サンプルコード
<?php
function add(int $x, int $y){
$z = $x + $y;
echo "addition=$z\n";
}
add(10, 20);
add(5.55, 6.66);
?>実行結果
addition=30 addition=11
2回目の add() 呼び出しでは float 型の値を引数に渡していますが、エラーや警告は表示されません。これは、PHPが内部的に float を int に自動変換(型強制)してから加算を行うためです。この自動的な型変換を防ぎたい場合は、declare 構文で strict_types=1 を指定します。
厳格な型チェック(strict_types)
strict_types を有効にすると、暗黙の型変換が行われなくなり、宣言された型と一致しない引数を渡した時点でエラーが発生します。
サンプルコード
<?php
declare(strict_types=1);
function add(int $x, int $y){
$z = $x + $y;
echo "addition=$z\n";
}
add(10, 20);
add(5.55, 6.66);
?>2回目の add() 呼び出しでは、次のように TypeError 例外がスローされます。
実行結果
addition=30 PHP Fatal error: Uncaught TypeError: Argument 1 passed to add() must be of the type integer, float given
可変長引数
引数の個数が事前に決まっていない場合は、可変長引数(...演算子)を使用できます。仮引数の前に ... を付けると、渡されたすべての引数が配列としてまとめて受け取られます。
サンプルコード
<?php
function add(...$numbers){
$ttl = 0;
foreach ($numbers as $num){
$ttl = $ttl + $num;
}
return $ttl;
}
$total = add(10, 15, 20);
echo "total= $total\n";
echo "total=" . add(1, 2, 3, 4, 5) . "\n";
?>実行結果
total= 45 total=15
func_get_args() で引数リストを取得する
また、func_get_args() 関数を使えば、関数に渡されたすべての引数を配列として取得することもできます。この方法では、関数定義に仮引数を書かずに、ループ処理で各引数の値を順に取り出せます。レガシーなコードや柔軟な設計が必要な場面で役立つテクニックです。
まとめ
- PHPの引数はデフォルトで値渡しされ、関数内の変更は外部に影響しない
- & を付けると参照渡しになり、関数内の変更が呼び出し元に反映される
- 型宣言を使うと誤った型の検出が可能になり、コードの信頼性が向上する
- strict_types=1 で自動型変換を無効化できる
- 可変長引数(...)や func_get_args() で個数不定の引数を扱える
これらの機能を適切に使い分けることで、より安全で保守性の高いPHPコードを書くことができます。
-
PHPのmax()関数とは?配列・複数の値から最大値を取得する方法を解説
max()関数の定義と用途PHPのmax()関数は、配列の中から最も大きい要素、または2つ以上のカンマ区切りの引数の中から最大の値を返す組み込み関数です。数値だけでなく文字列の比較にも対応しており、さまざまな場面で活用できます。構文配列を引数として渡す場合:max ( array $values ) : mixedまたは複数の値を直接渡す場合:max ( mixed $value1 [, mixed $... ] ) : mixedパラメータNo.パラメータと説明1values引数が1つだけ指定された場合は、同じ型または異なる型の値を含む配列を渡す必要があります。2value1, value2
-
PHPのlog10()関数とは?常用対数の計算方法と具体例をわかりやすく解説
定義と使用方法log10() 関数は、数値の常用対数(底が10の対数)を計算するための関数です。常用対数は「10を底とする対数」とも呼ばれ、log10x を求める際に使用されます。自然対数との間には、次のような関係式が成り立ちます。log10x = logex / loge10この式に基づけば、たとえば次のように計算できます。log10100 = loge100 / loge10 = 2PHPでは、この常用対数の計算を log10() 関数が担っています。構文log10 ( float $arg ) : floatパラメータ番号パラメータと説明1arg常用対数(底10の対数)を計算したい数値を