11. ユーザ定義関数

ユーザ定義関数とは

ビルトイン関数にない処理

ビルトイン関数で用意されていない処理は、オリジナルで関数を定義して処理しなければいけません。これをユーザ定義関数といいます。

数学の関数とプログラムの関数

プログラムでの関数は数学の関数のような考え方で、変数を与えて結果を返す機能のことをいいます。また、プログラムの関数のことをメソッドともいいます。

$$y = x + 5\tag{関数}$$ $$x = 2\tag{変数}$$ $$y = 7\tag{戻り値}$$

面倒な処理をまとめる

メソッドは複数の処理を1つにまとめて記述できるメリットがあります。関数を呼び出すだけで毎回決まった処理をするのに便利です。

引数と戻り値

メソッドは引数戻り値というキーワードがあり、引数はメソッドの入力値、戻り値は処理した結果を返す値のことです。

引数や戻り値は必須ではなく、メソッドによっては引数や戻り値を利用しない処理をすることもできます。

メソッド定義

メソッド定義の基本

引数で処理

$$y = x + 5$$

この式をメソッド名「calculate()」、引数「x」で定義します。

def calculate(x):
    y = x + 5
    return y

return で返す

引数「x」で計算した結果を、変数「y」に代入し、returnで返します。

メソッド名

メソッド定義は、任意のメソッド名に ( ) をつけ、メソッド名の前にキーワード functionを記述します。

function メソッド名()

メソッドの処理

メソッド名のあとは { } で囲んで、メソッドが処理をする領域を作ります。

function メソッド名()
{
    //この中に処理
}

「calculate」メソッドの定義は、つぎのようになります。

function calculate()
{
    //この中に処理
}

引数の定義

メソッドには入力値である引数を複数指定できます。引数の区切りは ,(カンマ)で区切ります。

function メソッド名(引数1, 引数2, ...)
{
}

calculate() の引数を「x」にした場合です。

function calculate($x)
{
}

メソッドの処理

引数を使った処理

{ } の中に処理を記述します。引数「x」の計算結果を変数「y」に代入します。

function calculate($x)
{
    $y = $x + 5;
}

戻り値

プログラム処理した変数はreturnで戻り値「y」を返します。return しないと、メソッドを実行しても結果が返らないので注意してください。

function calculate($x)
{
    $y = $x + 5;
    // return で値を返す
    return $y;
}

メソッドの実行

メソッドを定義したらメソッド名で実行します。メソッドの実行結果は変数で取得できます。

結果 = メソッド名();

メソッドの実行確認

calculate() の実行結果を変数に代入して表示してみましょう。

function calculate($x)
{
    $y = $x + 5;
    return $y;
}

$answer = calculate(2);

HTML表示

結果をHTMLで表示してみましょう。

<p><?= $answer ?></p>
結果
7

複数の引数

メソッドの引数は複数指定でき、それぞれの変数名を , (カンマ)で区切ります。

function totalPrice($price, $amount) {
    $tax = 1.1;
	$total_price = $price * $amount * $tax;
    return $total_price;
}
$total_price = totalPrice(200, 5);

HTML表示

結果をHTMLで表示してみましょう。

<h2>合計金額</h2>
<p><?= $total_price ?>円</p>
結果
合計金額
1100円

引数のデフォルト値

デフォルト値の代入

メソッド定義では、引数にデフォルト値を設定することができます。デフォルト値は引数に = で値を代入します。

function メソッド名(引数 = デフォルト値) {
    
}

引数データの省略

デフォルト値を設定しておくと、メソッド実行で引数の値を省略でき、デフォルト値で処理されます。

メソッド名();

デフォルト値の定義とメソッド実行

購入価格のポイント数を計算するメソッドを定義します。ポイント還元率は「0.1」(10%)をデフォルトとします。

function calculatePoint($price, $rate=0.01) {
	$point = $price * $rate;
    return $point;
}

ポイント数を10%(デフォルト)と5%で計算します。

$total_price = totalPrice(200, 5);

//引数を省略
$point1 = calculatePoint($total_price);

//引数を指定
$point2 = calculatePoint($total_price, 0.05);

HTMLで表示

結果をHTMLで表示してみましょう。

<h2>ポイント</h2>
<p><?= $point1 ?>pt</p>
<p><?= $point2 ?>pt</p>
結果
ポイント
11pt
55pt

引数のデータ型

PHP5 から引数にデータ型を宣言することができるようになりました。

function メソッド名(データ型 引数)
{

}

データ型のメリット

データ型を宣言するメリットは、意図しないデータ型で処理させないように対策できます。例えば数値処理したいときに、誤って文字列を入れてしまうと意図した処理ができません。

//Integer型で定義
function messageTax(int $price)
{

}

//Integer型に、String型をいれられない
messageTax("コーヒー");

データ型で処理

メソッドの引数にデータ型をつけて、実行してみましょう。

function messageTax(string $item_name, int $price, float $tax_rate = 0.1)
{
    $tax = $price * $tax_rate;
    $message = "{$item_name}の消費税は{$tax}円です。";
    return $message;
}

$message = messageTax('紅茶', 150);

HTML部分

結果をHTMLで表示してみましょう。

<h2>購入メッセージ</h2>
<p><?= $message ?></p>
結果
購入メッセージ
紅茶の消費税は15円です。

ローカル変数とスコープ

変数「x」「y」は関数の中で定義していますが、これをローカル変数といいます。 ローカル変数はメソッド外から参照できない(呼び出せない)ルールで、メソッドの { } 内の領域をスコープといいます。

function calculate($x)
{
    //関数のスコープ内のみ変数 $x, $y が有効
    $y = $x + 5;
}
// x, y は関数の外から参照できない
echo $x;
echo $y;

関数の応用

ユーザ定義関数を機能ごとに定義しておくと、引数を変えながら何度も再利用できプログラムしやすくなります。関数の応用として move() と moveMethod() を定義して実行してみましょう。

move() の定義と実行

move() はキャラクタ名と移動メッセージ表示します。キャラクタ名や移動方法の値はチェックしてメッセージを変えています。

//移動のメッセージ
function move($character_name, $method)
{
    if (empty($method)) {
        return "{$character_name}は家にいます";
    } else {
        return "{$character_name}が{$method}で移動しています";
    }
}

move() で変数をそれぞれ指定して実行するとメッセージが変わります。HTML部分で実行させてみましょう。

<p><?= move("イヌ", "徒歩") ?></p>
<p><?= move("ネコ", "") ?></p>
<p><?= move("キリン", "自転車") ?></p>
結果
イヌが徒歩で移動しています
ネコは家にいます
キリンが自転車で移動しています

moveMethod() の定義と実行

moveMethod() は移動距離によって移動方法を返します。また、雨の日($is_rain = true)のときはNULLを返すようにします。

//移動手段
function moveMethod($distance, $is_rain = false)
{
    if ($is_rain) return;
    $method = "";
    if ($distance < 1) {
        $method = '徒歩';
    } else if ($distance >= 1 && $distance < 5) {
        $method = '自転車';
    } else {
        $method = '電車';
    }
    return $method;
}

moveMethod() の実行

moveMethod() を実行したら変数をそれぞれ指定して、HTMLで表示してみましょう。

<h2>移動手段</h2>
<p><?= moveMethod(0.5) ?></p>
<p><?= moveMethod(3, true) ?></p>
<p><?= moveMethod(5, false) ?></p>
結果

移動手段が表示されました。NULLが返ったときは空欄になります。

徒歩

電車

move() と moveMethod() の組み合わせ

move() と moveMethod() を組み合わせて関数を実行します。move() の 第2引数に移動手段 moveMethod() を代入 します。

<h2>移動</h2>
<p><?= move("イヌ", moveMethod(0.5)) ?></p>
<p><?= move("ネコ", moveMethod(3, true)) ?></p>
<p><?= move("キリン", moveMethod(5, false)) ?></p>
結果
イヌが徒歩で移動しています
ネコは家にいます
キリンが電車で移動しています

このように関数をうまく使うと何度も再利用でき、複雑なプログラムがすっきりみやすくなりました。

演習

問題1

関数 say() を実行して「こんにちわ」と表示できるように、【あ】、【い】にコードをあてはめてプログラムを動かしてください。

【あ】 say($message) {
     return $message;
}
echo 【い】("こんにちわ");
echo PHP_EOL;

問題2

以下の引数を代入して結果のように表示するように、関数を使ってプログラムしてみましょう。

引数
  • LINE
  • AU
  • Pay
結果
LINEPay
AUPay
PayPay

問題3

距離(km)と時間(h)を引数として、時速(km/h)を計算する関数を定義してみましょう。距離 250km、時間 4時間の速度(km/h)を表示してみましょう。

問題4

「グー」「チョキ」「パー」をランダムで表示するプログラムを関数を定義して作成してみましょう。

問題5

以下のプログラムを実行して結果がでるように、関数 auth() を定義してみましょう。

<?php
define('ADMIN_ID', 'admin');
define('ADMIN_PW', 'admin1234');

$login_name = 'admin';
$password = '';
$message_1 = auth($login_name, $password);

$login_name = 'admin';
$password = '1234';
$message_2 = auth($login_name, $password);

$login_name = 'admin';
$password = 'admin1234';
$message_3 = auth($login_name, $password);
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
    <h2>認証</h2>
    <p><?= $message_1 ?></p>
    <p><?= $message_2 ?></p>
    <p><?= $message_3 ?></p>
</body>
</html>
結果
パスワードを入力してください。
ログイン名またはパスワードが間違っています。
管理者ログイン成功!

PHP超入門