@ PHP

function:関数から値を返す

戻り値の補足

関数はデータ出力または情報をデーターベースに記憶させるなどの動作に加え、値を計算することもでき、戻り値(関数が処理を終了し、呼び出し元に処理の結果として返す値)としてプログラム処理の後で使用することもできます。

関数の戻り値を補足するためには、変数に関数呼び出しを代入します。

functions_11.phpでは、変数 $number_to_display に組み込み関数 number_format()の戻り値を保存します。

関数の戻り値はいったん変数に代入されると、他の変数と同じように、この変数の持っている値を使うことができます。

functions_11.php

<?php
$number_to_display = number_format(310383948);
print "アメリカ合衆国の人口: $number_to_display";
?>

関数の値を返す

関数から値を返すためには、return キーワードを返す値といっしょに使います。

関数は実行中に、return キーワードを見つけるとすぐに、動作を中止して関連する値をかえします。

functions_12.php では、消費税とチップを加えたレストランの請求書の総額を返す関数を定義します。

functions_12.php

<?php
function restaurant_check($meal, $tax, $tip) {
    $tax_amount = $meal * ($tax / 100);
    $tip_amount = $meal * ($tip / 100);
    $total_amount = $meal + $tax_amount + $tip_amount;
    return $total_amount;
}
print number_format(restaurant_check(7500, 8, 15)).'yen';
?>

if()命令文に戻り値を使う

restaurant_check() が返す値は、プログラムの中で他の値と同じように使うことができます。

次の例では、if() 文に戻り値を使います

functions_13.php

<?php
function restaurant_check($meal, $tax, $tip) {
    $tax_amount = $meal * ($tax / 100);
    $tip_amount = $meal * ($tip / 100);
    $total_amount = $meal + $tax_amount + $tip_amount;
    return $total_amount;
}

$total = restaurant_check(7500, 8, 15);

print "私は現金で10,000円しか持っていません、ですから‥‥<br>\n";
if ($total > 10000) {
    print '私は私のクレジットカードで支払う必要があります。';
} else {
    print '私は現金で支払うことができます。';
}
?>

関数から配列を返す

return 命令文は1つの値を返すだけで、return 15,30 のように複数の値を返すことはできません。

関数から1つ以上の値を返したい場合は、1個の配列に値を入れてからその配列を返します。

functions_14.php は、チップが加算される前とチップが加算された後の総額を含む2つの要素の配列を返す resutaurant_check() の修正版です。

functions_14.php

<?php
function restaurant_check($meal, $tax, $tip) {
    $tax_amount = $meal * ($tax / 100);
    $tip_amount = $meal * ($tip / 100);
    $total_notip = $meal + $tax_amount;
    $total_tip = $meal + $tax_amount + $tip_amount;
    return array($total_notip, $total_tip);
}

$totals = restaurant_check(8500, 8, 15);

if($totals[0] < 10000) {
    print "チップを含まない合計は 10,000yen 未満です。.<br>\n";
}
if($totals[1] < 10000) {
    print 'チップを含む合計は 10,000yen 未満です。';
}
?>

複数の return 命令文を持つ関数

return 命令文といっしょに帰すことができるのは1つの値だけですが、関数内に2つ以上のreturn 命令文があってもかまいません。

functions_15.php では、現金かクレジットカードかの支払い方法を決定する新しい関数を定義します。

処理の流れとしては、restaurant_check() の結果(9225)が $total に代入され、payment_method() に渡されます。

$amount と $cash_on_hand との比較では payment_method() は false なので、$payment_method() 内の else ブロックが実行されます。これによって関数は cash をかえします。

functions_15.php

<?php
function restaurant_check($meal, $tax, $tip) {
    $tax_amount = $meal * ($tax / 100);
    $tip_amount = $meal * ($tip / 100);
    $total_amount = $meal + $tax_amount + $tip_amount;
    return $total_amount;
}

function payment_method($cash_on_hand,$amount) {
    if($amount > $cash_on_hand) {
        return 'クレジットカード';
    } else {
        return '現金';
    }
}

$total = restaurant_check(7500, 8, 15);

$method = payment_method(10000, $total);
print 'わたしは、 '.$method. 'で支払います。';
?>

if() 命令文で戻り値を使う

functions_16.php では、if() 命令文のテスト式の中で restaurant_check() を呼び出して、何をするかを決定します。

テスト式を評価するために、PHPは最初に resutaurent_check() をよびだします。

次に関数の戻り値が、変数または文字値ならばそのまま 10000 と比較されます。

restaurant_check() が 10000 以下の数を返す場合は、1番目の print 命令文が実行されます。それ以外の場合は2番目の print 命令文が動作します。

functions_16.php

<?php
function restaurant_check($meal, $tax, $tip) {
    $tax_amount = $meal * ($tax / 100);
    $tip_amount = $meal * ($tip / 100);
    $total_amount = $meal + $tax_amount + $tip_amount;
    return $total_amount;
}

if(restaurant_check(7500, 8, 15) < 10000) {
    print '1万円以下なので、現金で払えます。';
} else {
    print '1万円以上なので、クレジットカードで払います。';
}
?>

true または false を返す関数

functions_17.php では、can_pay_cash() 関数は2つの引数を比較します。$amount のほうが大きければ、次に関数は true をかえします。それ以外では false をかえします。

このテスト式は関数の呼び出しなので、2つの引数 10000 と $total で can_pay_cash() をよびだします。

関数の戻り値はテスト式の真偽値となり、どちらのメッセージを出力するかを制御します。

functions_17.php

<?php
function restaurant_check($meal, $tax, $tip) {
    $tax_amount = $meal * ($tax / 100);
    $tip_amount = $meal * ($tip / 100);
    $total_amount = $meal + $tax_amount + $tip_amount;
    return $total_amount;
}

function can_pay_cash($cash_on_hand,$amount) {
    if($amount > $cash_on_hand) {
        return false;
    } else {
        return true;
    }
}

$total = restaurant_check(7500, 8, 15);
if (can_pay_cash(10000, $total)) {
    print '現金で払います。';
} else {
    print 'クレジットカードで払います。';
}
?>

テスト式内の代入と関数呼び出し

functions_18.php では、complete_bill()関数は、税金とチップを含む請求額が $cash_on_hand より多いなら、false を返します。請求額が $cash_on_hand より少ないか等しいなら、そのときは請求額が返されます。

関数外の if() 命令文がテスト式を評価するときは次のようになります。

  1. complete_bill() は、7500,8,15,そして10000という引数で呼び出されます。
  2. complete_bill() の戻り値は $total に代入されます。
  3. 代入結果は、true または false のどちらかに変換されてテスト式の最終結果として使われます。

functions_18.php

<?php
function complete_bill($meal, $tax, $tip, $cash_on_hand) {
    $tax_amount = $meal * ($tax / 100);
    $tip_amount = $meal * ($tip / 100);
    $total_amount = $meal + $tax_amount + $tip_amount;
    if ($total_amount > $cash_on_hand) {
        return false;
    } else {
        return $total_amount;
    }
}

if ($total = complete_bill(7500, 8, 15, 10000)) {
    print "ごちそうさまでした。". number_format($total)." yen 払います。";
} else {
    print "私には十分なお金がありません。皿洗いでもしましょうか?";
}
?>