MENU

【PHP】関数の作り方と使い方を解説|Webの基礎

PHPの関数の作り方と使い方を解説|Webの基礎
目次

はじめに

前回の記事まで、count()やsort()など、PHPにあらかじめ用意されている関数を使ってきました。

今回は、自分で関数を作る方法を解説します。よく使う処理を関数にしておくと、同じコードを何度も書かずに済み、修正も1か所で済むようになります。

関数とは?

関数とは、決まった処理をひとまとめにして名前を付けたものです。名前を書いて呼び出すだけで、まとめておいた処理を何度でも実行できます。

PHPの関数には、次の2種類があります。

種類例
組み込み関数(PHPに最初から用意されている)count()・sort()・implode()など
ユーザー定義関数(自分で作る)今回解説する関数

たとえば、税込価格を計算する処理がページのあちこちにあると、税率が変わったときにすべて修正しなければなりません。関数にまとめておけば、関数の中を1か所直すだけで済みます。

VBAのFunctionプロシージャと同じ考え方です。値を返さない処理をまとめる場合、VBAではSubを使いますが、PHPではどちらもfunctionで書きます。

関数の作り方と呼び出し方

関数は、functionキーワードを使って次の形で作ります。関数を作ることを「定義する」と言います。

function 関数名() {
    // まとめておく処理
}

定義した関数は、関数名()と書いて呼び出します。

<?php
    // 関数を定義する
    function sayHello() {
        echo "こんにちは!<br>";
    }

    // 関数を呼び出す
    sayHello();
    sayHello();

実行すると、「こんにちは!」が2回表示されます。関数を定義しただけでは処理は実行されず、呼び出したときに初めて実行されます。

関数名は、変数名と同じく英字・数字・アンダースコア(_)が使え、先頭に数字は使えません。変数と違って$は付けません。sayHelloのように「動詞+目的語」で、何をする関数か分かる名前にするのが一般的です。

PHPでは、同じファイル内であれば、関数を定義する前の行で呼び出しても動きます。ただし、読みやすさのために、関数はファイルの上の方にまとめて定義しておくのがおすすめです。

引数:関数に値を渡す

関数を呼び出すときに値を渡すと、その値を使って処理できます。この渡す値を引数(ひきすう)と呼びます。

<?php
    function greet($name) {
        echo "こんにちは、{$name}さん!<br>";
    }

    greet("田中"); // こんにちは、田中さん!
    greet("佐藤"); // こんにちは、佐藤さん!

関数の定義で()の中に書いた$nameに、呼び出すときに渡した"田中"が入ります。同じ関数でも、渡す値によって結果を変えられます。

引数は、カンマで区切って複数指定できます。呼び出すときは、定義した順番どおりに値を渡します。

<?php
    function showPrice($item, $price) {
        echo "{$item}:{$price}円<br>";
    }

    showPrice("ノート", 150); // ノート:150円

定義した数より少ない引数で呼び出すと、ArgumentCountErrorというエラーになります。

戻り値:関数から結果を受け取る(return)

関数の中でreturnを使うと、処理した結果を呼び出し元に返せます。この返す値を戻り値と呼びます。

<?php
    function add($a, $b) {
        return $a + $b;
    }

    $total = add(3, 5);
    echo $total; // 8

add(3, 5)の部分が、戻り値の8に置き換わるイメージです。戻り値は変数に代入したり、echo add(3, 5);のように直接表示したり、別の計算に使ったりできます。

関数の呼び出しの流れを示した図。add(3, 5)で呼び出すと、引数の3と5が$aと$bに入り、関数の中で$a + $bが計算され、returnで8が呼び出し元に返されて$totalに代入される

echoとreturnの違い

関数の中でechoすると、その場で画面に表示されるだけで、結果を後から使うことはできません。一方、returnで返した値は、呼び出し元で自由に使えます。

計算結果を表示だけでなく別の処理にも使う可能性があるなら、関数の中ではechoせずreturnで返し、表示は呼び出し元で行うようにすると、使い回しやすい関数になります。

returnで処理が終わる

returnが実行されると、その時点で関数の処理が終了します。if文と組み合わせると、条件によって早めに結果を返せます。

<?php
    function checkAge($age) {
        if ($age < 0) {
            return "年齢が正しくありません";
        }
        if ($age >= 20) {
            return "成人です";
        }
        return "未成年です";
    }

    echo checkAge(25); // 成人です
    echo checkAge(-1); // 年齢が正しくありません

returnで返せる値は1つだけです。複数の値を返したいときは、return [$min, $max];のように配列にまとめて返します。returnを書かない関数の戻り値はnullになります。

デフォルト引数:省略できる引数を作る

引数に= 値で初期値を指定しておくと、呼び出すときにその引数を省略できるようになります。これをデフォルト引数と呼びます。

<?php
    function greet($name, $suffix = "さん") {
        return "{$name}{$suffix}";
    }

    echo greet("田中");       // 田中さん(省略したので"さん"が使われる)
    echo greet("佐藤", "様"); // 佐藤様(指定した値が使われる)

デフォルト引数は、省略しない引数よりも後ろに書きます。

型宣言:引数と戻り値の型を決める

引数の前や()の後ろに型を書くと、受け取る値や返す値の型を決められます。これを型宣言と呼びます。

<?php
    function add(int $a, int $b): int {
        return $a + $b;
    }

    echo add(3, 5); // 8

int $aは「$aは整数」、): intは「戻り値は整数」という意味です。型宣言した引数に、数値に変換できない値("abc"など)を渡すと、TypeErrorというエラーになります。

型意味
int整数
float小数を含む数値
string文字列
bool真偽値(true / false)
array配列

型宣言は書かなくても関数は動きますが、書いておくと間違った型の値が渡されたときにすぐエラーで気づけるうえ、関数の使い方がひと目で分かるようになります。

型宣言があっても、"5"のような数値として読める文字列は、自動で5に変換されて受け付けられます。型の変換についてはデータ型の記事も参考にしてください。

変数のスコープ:関数の中と外は別の世界

関数を使うときに特に注意したいのが、変数のスコープ(有効範囲)です。PHPでは、関数の外で作った変数は、関数の中では使えません。

<?php
    $taxRate = 0.1; // 関数の外で作った変数

    function withTax($price) {
        return $price * (1 + $taxRate); // 関数の中からは見えない
    }

    echo withTax(100);
    // Warning: Undefined variable $taxRate
    // 100

関数の中の$taxRateは、外の$taxRateとは別の、まだ値が入っていない変数として扱われるため、警告が出て正しく計算されません。反対に、関数の中で作った変数も、関数の外からは使えません。

関数の中で使いたい値は、引数で渡すのが基本です。

<?php
    $taxRate = 0.1;

    function withTax($price, $rate) {
        return $price * (1 + $rate);
    }

    echo withTax(100, $taxRate); // 110
変数のスコープを示した図。関数の外の$taxRateは関数の中から直接は見えず、引数として渡すと関数の中で$rateとして使える。関数の中で作った変数も外からは見えない

関数の中でglobal $taxRate;と書くと外の変数を使えるようになりますが、関数がどの値に頼っているのかが分かりにくくなるため、おすすめしません。JavaScriptでは関数の中から外の変数を使えるので、JavaScriptに慣れている人は特に注意しましょう。

実務サンプル(価格表示の関数を使い回す)

ネットショップの商品一覧で、「税込価格の計算」と「金額の表示形式」を関数にまとめ、すべての商品で使い回すサンプルです。

価格表示の関数を使った商品一覧の表示例。デスクチェア・モニター・キーボードの3商品について、税抜価格と税込価格が3桁区切りの円表示で並ぶ
<?php
    // 税込価格を計算する(税率は省略すると10%)
    function taxIncluded(int $price, float $rate = 0.1): int {
        return (int)floor($price * (1 + $rate));
    }

    // 金額を「12,800円」の形にする
    function formatYen(int $amount): string {
        return number_format($amount) . "円";
    }

    $products = [
        ["name" => "デスクチェア", "price" => 12800],
        ["name" => "モニター",     "price" => 24980],
        ["name" => "キーボード",   "price" => 3480],
    ];
?>
<ul>
    <?php foreach ($products as $product): ?>
        <?php
            $price = $product["price"];
            $text  = $product["name"] . ":" . formatYen($price)
                   . "(税込 " . formatYen(taxIncluded($price)) . ")";
        ?>
        <li><?php echo $text; ?></li>
    <?php endforeach; ?>
</ul>

ブラウザには次のように表示されます。

・デスクチェア:12,800円(税込 14,080円)
・モニター:24,980円(税込 27,478円)
・キーボード:3,480円(税込 3,828円)

ポイントは次のとおりです。

  • floor()は小数点以下を切り捨てる関数、number_format()は数値を3桁ごとのカンマ区切りにする関数です(どちらも組み込み関数)
  • formatYen(taxIncluded(…))のように、関数の戻り値をそのまま別の関数の引数に渡せます
  • 税率が変わったときは、taxIncluded()のデフォルト引数を1か所直すだけで、すべての商品の表示が変わります
  • 軽減税率(8%)の商品なら、taxIncluded($price, 0.08)のように第2引数を指定します

よくある質問・エラー対処

Q. Call to undefined functionというエラーが出ます

→ 定義していない関数を呼び出しています。関数名のつづりが定義と一致しているか確認してください。別のファイルで定義した関数を使う場合は、そのファイルを読み込む必要があります。


Q. Cannot redeclareというエラーが出ます

→ 同じ名前の関数を2回定義しています。countやstrlenなど、PHPの組み込み関数と同じ名前も使えません。別の名前に変更してください。


Q. 関数の中でUndefined variableの警告が出ます

→ 関数の外で作った変数を、関数の中で使おうとしている可能性があります。関数の中で使う値は、引数で渡してください。


Q. Too few arguments to functionというエラーが出ます

→ 関数の定義で決めた数より、少ない引数で呼び出しています。引数の数を確認するか、省略したい引数にはデフォルト値を指定してください。

おわりに(まとめ)

まとめ

よく使う処理は関数にまとめると、使い回しやすく、修正もしやすくなります。

  • ✅ function 関数名() { } で定義し、関数名() で呼び出す
  • ✅ 引数で値を渡し、returnで結果(戻り値)を返す
  • ✅ returnが実行されると、その時点で関数の処理が終わる
  • ✅ デフォルト引数を指定すると、その引数を省略できる
  • ✅ 型宣言で、引数と戻り値の型を決められる
  • ✅ 関数の外の変数は中から使えないので、引数で渡す

次回は、名前を付けずにその場で作る「無名関数・アロー関数」と、それを使って配列を絞り込む・変換する方法について解説します。

次回は、無名関数・アロー関数の書き方と、array_filter関数・array_map関数で配列を絞り込んだり、まとめて変換したりする方法について解説予定です。

この記事が、少しでも誰かのお役に立てれば幸いです。

関連記事

当サイトの記事で使用したVBAなどのサンプルをDLできます

この記事のサンプルはありません!

ダウンロードページへは下のカードをクリックすればジャンプできます。
よろしければご利用ください!


【CSS】テキスト関連プロパティについて基本解説|Webの基礎


よかったらシェアしてね!
  • URLをコピーしました!
目次