こんにちは、かつコーチです。
前回は連想配列を使って、意味のある名前でデータを管理する方法を解説しました。
今回のテーマは「関数」です。
関数を使えるようになると、同じ処理を何度も書かずに済むようになり、コードが一気に整理されます。
配列と組み合わせて使う場面も多いので、前回までの内容を活かしながら見ていきましょう。
関数とは?
関数の役割
関数とは、決まった処理をひとまとめにして、名前をつけておける仕組みのことです。
同じ処理を何度も書きたくなったとき、コピペで対応するとこうなります。
<?php
$price1 = 1000;
$tax1 = $price1 * 0.1;
echo "税込価格: " . ($price1 + $tax1) . "円\n";
$price2 = 2000;
$tax2 = $price2 * 0.1;
echo "税込価格: " . ($price2 + $tax2) . "円\n";
?>
同じ計算ロジックが何度も登場していて、消費税率が変わったときにすべての箇所を直す必要があり、修正漏れの原因になります。
関数を使うと、この処理を1箇所にまとめられます。
<?php
function calcTaxIncluded($price) {
$tax = $price * 0.1;
return $price + $tax;
}
echo "税込価格: " . calcTaxIncluded(1000) . "円\n";
echo "税込価格: " . calcTaxIncluded(2000) . "円\n";
?>
税率が変わっても、calcTaxIncluded 関数の中身を1箇所直すだけで済みます。
なぜ関数が必要なのか
関数を使う目的は大きく2つあります。
1つ目は「同じ処理の重複を減らす」ことです。
2つ目は「処理に意味のある名前をつけて、コードの見通しをよくする」ことです。
calcTaxIncluded($price) という名前がついているだけで、「税込価格を計算している」と一目で分かるようになります。
長いコードの塊よりも、意味のある名前がついた関数の呼び出しの方が、後から読んだときに理解しやすくなります。
関数の基本的な書き方
関数を定義する
関数は function キーワードを使って定義します。
<?php
function 関数名(引数) {
// 処理内容
return 戻り値;
}
?>
引数や戻り値がない、最もシンプルな関数から見てみましょう。
<?php
function sayHello() {
echo "こんにちは!";
}
sayHello(); // こんにちは!
?>
引数を受け取る
引数(ひきすう)とは、関数を呼び出すときに渡す値のことです。
<?php
function sayHelloTo($name) {
echo "こんにちは、" . $name . "さん!\n";
}
sayHelloTo("かつコーチ"); // こんにちは、かつコーチさん!
sayHelloTo("佐藤"); // こんにちは、佐藤さん!
?>
$name の部分を「仮引数」、呼び出すときに渡す "かつコーチ" などの実際の値を「実引数」と呼びます。
引数はカンマ区切りで複数受け取ることもできます。
<?php
function introduce($name, $age) {
echo $name . "さん(" . $age . "歳)です。\n";
}
introduce("かつコーチ", 30); // かつコーチさん(30歳)です。
?>
戻り値を返す
戻り値(もどりち)とは、関数の処理結果として呼び出し元に返す値のことです。
return キーワードを使って値を返します。
<?php
function add($a, $b) {
return $a + $b;
}
$result = add(3, 5);
echo $result; // 8
?>
echo で直接表示するのではなく return で値を返すことで、その結果を変数に入れたり、別の処理で再利用したりできます。
return が実行された時点で、関数の処理はそこで終了する点も覚えておきましょう。
<?php
function checkAge($age) {
if ($age < 0) {
return "不正な値です"; // ここで処理が終わる
}
return $age . "歳です";
}
echo checkAge(-5); // 不正な値です
echo checkAge(20); // 20歳です
?>
配列を引数として受け取る
前回・前々回で学んだ配列は、関数の引数としてもそのまま渡せます。
<?php
function totalPrice($prices) {
$total = 0;
foreach ($prices as $price) {
$total += $price;
}
return $total;
}
$cartPrices = [1200, 3000, 500];
echo "合計金額: " . totalPrice($cartPrices) . "円";
// 出力: 合計金額: 4700円
?>
連想配列を渡すこともできます。
<?php
function formatUser($user) {
return $user["name"] . "さん(" . $user["age"] . "歳)";
}
$user = ["name" => "かつコーチ", "age" => 30];
echo formatUser($user); // かつコーチさん(30歳)
?>
「配列をまとめて関数に渡し、関数の中でループや加工をして、結果を返す」という組み合わせは、実務で最も頻繁に登場するパターンのひとつです。
よくあるつまずきポイント・エラー対処
引数の数が合わずエラーになる
私が実際に何度もやってしまった失敗が、関数を定義したときの引数の数と、呼び出すときに渡す値の数を合わせ忘れるミスです。
❌ Before:必須の引数を渡し忘れる
<?php
function introduce($name, $age) {
echo $name . "さん(" . $age . "歳)です。\n";
}
introduce("かつコーチ"); // $age を渡し忘れている
?>
これを実行すると、次のようなエラーが出ます。
Fatal error: Uncaught ArgumentCountError: Too few arguments to function introduce(), 1 passed and exactly 2 expected
私は最初、このエラーメッセージの「1 passed and exactly 2 expected(1個渡したが、正確に2個必要)」という部分の意味がすぐには分からず、しばらく関数定義自体を読み直していました。
原因を突き止めてみると、単純に呼び出し側で引数を1つ渡し忘れていただけでした。
✅ After:デフォルト値を設定するか、渡す引数の数を確認する
<?php
function introduce($name, $age = null) {
if ($age === null) {
echo $name . "さんです。\n";
} else {
echo $name . "さん(" . $age . "歳)です。\n";
}
}
introduce("かつコーチ"); // かつコーチさんです。
introduce("佐藤", 25); // 佐藤さん(25歳)です。
?>
「引数が省略される可能性がある」場合は、デフォルト値を設定しておくとエラーを防げます。
デフォルト引数の詳しい使い方は、次回の記事で詳しく解説します。
return と echo を混同する
初心者のうちに混同しやすいのが、return と echo の違いです。
<?php
function add($a, $b) {
echo $a + $b; // 画面に表示するだけで、値を返していない
}
$result = add(3, 5);
echo $result; // 何も表示されない(returnしていないためnullが返る)
?>
echo は画面に文字を表示するだけの命令で、関数の外にその値を渡すことはできません。
$result に計算結果を入れたい場合は、必ず return を使う必要があります。
<?php
function add($a, $b) {
return $a + $b; // 値を呼び出し元に返す
}
$result = add(3, 5);
echo $result; // 8
?>
「表示したいのか、値として使い回したいのか」を意識して echo と return を使い分けましょう。
応用・一歩先の使い方
戻り値の型を明示する
PHPでは、引数や戻り値に「型」を指定することもできます。
<?php
function calcTaxIncluded(int $price): int {
$tax = (int)($price * 0.1);
return $price + $tax;
}
echo calcTaxIncluded(1000); // 1100
?>
int $price は「引数は整数を受け取る」、: int は「戻り値は整数を返す」という意味です。
型を明示しておくと、意図しない型の値が渡されたときにエラーとして検知しやすくなり、バグの早期発見につながります。
チーム開発では、こうした型宣言があるだけでコードの読みやすさが大きく変わってきます。
まとめ
この記事のポイント
- 関数は処理をひとまとめにして名前をつける仕組みで、コードの重複を減らせる
引数は関数に渡す値、戻り値はreturnで返す処理結果echoは画面表示のみ、returnは値を呼び出し元に返す(役割が異なる)- 引数の数が合わないと
ArgumentCountErrorになるため、省略される可能性がある引数にはデフォルト値を検討する - 配列を関数に渡してループ処理する組み合わせは実務で頻出のパターン
次に読むべき記事
関数の基本が分かったら、次は引数をより柔軟に扱える「デフォルト引数」「可変長引数」を学んでいきましょう。
→ 次の記事:PHPのデフォルト引数・可変長引数(…)の使い方