【PHP】関数(function) - 処理のまとまり

【PHP】関数(function) - 処理のまとまり

処理をまとめた“関数”と呼ぶ仕組みがあります。

関数はソースコードに拡張性や柔軟性、コード量削減などの効果を生み出します。

ここでは、関数について解説します。

検証環境

関数

関数は“処理のまとまり”です。

関数を使うには“関数の定義”と“関数の呼び出し”を行います。

関数の定義

関数の定義は“処理のまとまりを関数として定義すること”です。

開発者は目的のプログラムに応じて、任意の関数を定義できます。

基本構文

function 関数名() {
    処理
}

関数名は変数名と同様にルールに従って、任意の名称に決めることができます。

ルールは正規表現で表され、^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$のように定められていますが、少し覚えにくいので、次のように解釈しておくと良いでしょう。

  • 使用可能な文字はアルファベット(大文字・小文字)・数字・アンダースコア(_)
  • 頭文字はアルファベットまたはアンダースコア(_)のみ
  • 予約語以外(予め決まった意味を持つ単語)

サンプル

<?php

___ih_hl_start
function message() {
    echo "Good Morning!\n";
    echo "Good Afternoon!\n";
    echo "Good Night!\n";
}
___ih_hl_end

?>
$ php sample.php
$

3〜7行目が関数の定義です。

関数名はmessage、処理の内容はブロック(波括弧{})内の3つのechoです。

関数は定義のみでは、その内容が実行されません。

そのため実行結果の出力はありませんが、正常な動作です。

関数の呼び出し

関数の呼び出しは“関数の実行を明示的にすること”です。

関数は任意の箇所で呼び出すことで、その内容が実行されます。

※ 関数を呼び出せるのは、その関数の有効スコープのみです。スコープについては別途解説します。

基本構文

関数名()

関数を呼び出す箇所に、関数名に続いて丸括弧(())を記述します。

サンプル

<?php

function message() {
    echo "Good Morning!\n";
    echo "Good Afternoon!\n";
    echo "Good Night!\n";
}

___ih_hl_start
message();
___ih_hl_end

?>
$ php sample.php
Good Morning!
Good Afternoon!
Good Night!

9行目が関数の呼び出しです。

定義済みのmessage関数を呼び出しており、実行結果からもその内容である3つのechoが実行されたことが分かります。

複数の関数

関数は関数名が重複していなければ、任意の数だけ定義できます。

<?php

function message() {
    echo "Good Morning!\n";
    echo "Good Afternoon!\n";
    echo "Good Night!\n";
}

___ih_diff_start
+function simple() {
+    echo "Hello World!\n";
+}
___ih_diff_end

message();
___ih_diff_start
+simple();
___ih_diff_end

?>
$ php sample.php
Good Morning!
Good Afternoon!
Good Night!
Hello World!

9〜11行目と14行目にsimple関数の定義と呼び出しを追加しました。

このように関数は複数定義できます。

また、1度定義した関数は何回でも呼び出すことが可能です。

<?php

function message() {
    echo "Good Morning!\n";
    echo "Good Afternoon!\n";
    echo "Good Night!\n";
}

function simple() {
    echo "Hello World!\n";
}

message();
simple();
___ih_diff_start
+simple();
+simple();
___ih_diff_end

?>
$ php sample.php
Good Morning!
Good Afternoon!
Good Night!
Hello World!
Hello World!
Hello World!

simple関数を3回呼び出しており、実行結果にHello Worldが3回表示されていることから、正常に動作していることが分かります。

標準関数と独自関数

PHPの関数は“標準関数”と“独自関数(ユーザー定義関数)”の2種類あります。

標準関数はPHPがあらかじめ定義した関数で、var_dump関数やgettype関数などその他にも様々な関数があり、呼び出すだけで使うことができます。

独自関数(ユーザー定義関数)はPHPのユーザー、すなわち開発者が定義する関数です。

メリット

関数のメリットは主に次の3つです。

  1. コード量の削減
  2. 可読性の向上
  3. 変更の容易さ

各メリットについて関数を使用しない場合と、使用する場合のコードを比べて確認します。

関数を使用しないコード

<?php

echo "Good Morning!\n";
echo "Good Afternoon!\n";
echo "Good Night!\n";

echo "Good Morning!\n";
echo "Good Afternoon!\n";
echo "Good Night!\n";

echo "Good Morning!\n";
echo "Good Afternoon!\n";
echo "Good Night!\n";

echo "Good Morning!\n";
echo "Good Afternoon!\n";
echo "Good Night!\n";

?>

関数を使用するコード

<?php

function message() {
    echo "Good Morning!\n";
    echo "Good Afternoon!\n";
    echo "Good Night!\n";
}

message();
message();
message();
message();

?>

関数を使ったコードは次の3つのechoを1つのまとまりとして関数定義しています。

echo "Good Morning!\n";
echo "Good Afternoon!\n";
echo "Good Night!\n";

このように同じ処理を1つにまとめることを共通化、1つの処理にまとめたものを共通処理と呼びます。

1.コード量の削減

共通化によって、5行のコード量の削減に成功しています。

このコードではたったの5行ですが、何十万行とある本格的なプログラムではより多くのコード量を削減に繋がります。

2.可読性の向上

コード量の削減にも関係しますが、コード量が少ない方が読みやすくなります。

また、関数を使用しないコードは、同じコードを4回読む必要がありますが、使用した場合は1度で済みます。

3.変更の容易さ

処理の内容を変更する時、関数を使用した方が容易に変更できます。

例えば、Nightの部分をLuckに変更するケースを考えます。

関数を使用しない場合は、4ヶ所の書き直しが必要です。

<?php

echo "Good Morning!\n";
echo "Good Afternoon!\n";
___ih_diff_start
-echo "Good Night!\n";
+echo "Good Luck!\n";
___ih_diff_end

echo "Good Morning!\n";
echo "Good Afternoon!\n";
___ih_diff_start
-echo "Good Night!\n";
+echo "Good Luck!\n";
___ih_diff_end

echo "Good Morning!\n";
echo "Good Afternoon!\n";
___ih_diff_start
-echo "Good Night!\n";
+echo "Good Luck!\n";
___ih_diff_end

echo "Good Morning!\n";
echo "Good Afternoon!\n";
___ih_diff_start
-echo "Good Night!\n";
+echo "Good Luck!\n";
___ih_diff_end

?>

関数を使用した場合は、1ヶ所の書き直しのみで対応できます。

<?php

function message() {
    echo "Good Morning!\n";
    echo "Good Afternoon!\n";
___ih_diff_start
-    echo "Good Night!\n";
+    echo "Good Luck!\n";
___ih_diff_end
}

message();
message();
message();
message();

?>

デメリット

デメリットは“メリットを理解せず使ってしまうと複雑なプログラムになる”ということです。

例えば、関数を使用してもコード量が減らない場合や、本来意味が異なるコードを共通化してしまうなどです。

デメリットを回避するにはメリットを理解して関数を使いましょう。

演習問題

問題1

次の実行結果になるプログラムを作成してください。
なお、下記条件を満たすものとします。

  • Hello World!を1回出力するgreeting関数を定義する
  • 実行結果になるようにgreeting関数を呼び出す
Hello World!
Hello World!
Hello World!

問題2

時間(0~23)に応じてあいさつ文を出力するプログラムを作成してください。
なお、下記条件を満たすものとします。

  • あいさつ文は朝、昼、夜の3種類とする。
  • あいさつ文と対応する時間は表の通り
  • 各種あいさつ文を出力する関数を定義する
  • あいさつ文は関数を使って出力する
  • 時間は標準入力で入力(0~23)する
種類 時間 挨拶文
0~11 Good morning!
It’s a nice weather.
12~17 Good afternoon!
It’s a nice breeze.
18~23 Good evening!
The moon is beautiful.
$ php practice.php
HOUR > 9
Good morning!
It's a nice weather.
$ php practice.php
HOUR > 13
Good afternoon!
It's a nice breeze.
$ php practice.php
HOUR > 21
Good evening!
The moon is beautiful.
$ php practice.php
HOUR > 99
Please enter from 0 to 23.
$ php practice.php
HOUR > -1
Please enter from 0 to 23.