PHPの「関数」で処理を共通化して再利用する――プログラミングの幅をぐっと広げようWeb業界で働くためのPHP入門(9)(2/3 ページ)

» 2017年08月07日 05時00分 公開

関数を自分で作ってみる

 関数について理解できたら、今後は何か処理をしたい場合は、まずは使えそうな関数があるかどうかを「関数リファレンス」ページ、あるいは検索などで調べ、それを使っていけばいいでしょう。

 しかし該当するものがない場合は、自分で作るしかありません。ここでは、自分で関数を作る方法を解説します。

関数定義はfunctionキーワード

 では、サンプルで確認してみましょう。以下のuseUserDefinedFunction.phpを作成し、実行してください。

<?php
function multiplyArray(array $array): float  // (1)
{
    $num = 1;
    foreach($array as $value) {
        $num *= $value;
    }
    return $num;  // (2)
}
    
$list = [5, 4, 8, 6, 2, 9];  // (3)
$result = multiplyArray($list);  // (4)
print("配列の計算結果: ".$result);
リスト3 phplesson/chap09/useUserDefinedFunction.php

 実行結果は下記の通りです。

配列の計算結果: 17280

 この処理は、(3)で定義した配列の各要素を掛け合わせた結果を表示するというものです。その中で、配列の各要素を掛け合わせた結果を得る処理そのものを関数として定義しています。それが、2〜9行目です。

 関数の定義は下記の書式です。

構文 関数定義

function 関数名(引数の型 引数, 引数の型 引数, ……): 戻り値の型

{

  処理;

  return 戻り値;

}


 まず、処理全体を波カッコブロックで囲みます。リスト3では3〜9行目がそれに当たります。ここでは、配列の各要素をループさせながら掛け合わせるという処理を行っています。

 そのブロック全体が関数であることを明示します。それがfunctionキーワードです。リスト3では(1)の部分です。

 functionの次には、その関数名を記述します。関数名は小文字から始めればどのような名称にしても構いませんが、その処理内容が分かる名前にした方がいいでしょう。使用できる文字に関しては変数と同じです。

 関数名の次に()を記述し、その中に必要な引数を記述します。引数といっても変数の一種なので、変数と同様に記述します。ただし引数は、先述のように、「ここで記述した処理を行う上で、ブロック外からデータをもらわないといけないもの」を記述します。例えば、「配列の各要素を掛け合わせた処理」は、外部から配列をもらわないと成り立ちません。そこで、下記のように記述するのです(リスト3の(1)参照)。

(array $array)

 引数名は通常の変数名と同様の付け方であれば、どのような名称でも構いませんが、ここでも分かりやすい名称にしておいた方がいいでしょう。また、引数はあくまで関数内部の処理として外部からもらわないといけないデータなので、1つとは限りません。その場合は下記のようにカンマ区切りで複数並べます。

multiplyArrayWithParam(array $array, int $param)

 一方、全くいらない場合もあります。その場合は下記のように引数を記述しません。

getArraySum()

 なお先述の通り、PHPではデータ型は意識しなくても動作するので、下記のように、「引数の型」や「戻り値の型」は記述しなくても問題はありません。

function multiplyArray($array)

 ただ、「関数リファレンス」にもデータ型が記述されているように、自分で関数を定義する際も極力記述するように心掛けましょう(*)。

*)ただし、戻り値の型を指定できるのはPHP 7以降です。また、引数の型についてもPHP 5環境では配列/オブジェクトしか指定できないので、注意してください。

注意! 関数の波カッコの位置

 ifやwhileの制御構文では、波カッコの開始カッコは下記のようにifと同じ行に記述しました。

if(……) {

 一方、関数では改行して次の行に記述しています。もちろん、条件分岐やループと同じように、このカッコの位置は下記のようにfunctionと同じ行に記述しても問題ありません。

function multiplyArray(array $array): float {

 ただ、PHPでは関数を定義するときには、改行して次の行から波カッコを開始するのが普通です。


戻り値を決める「return」キーワード

 さて、リスト3の(2)に注目してください。multiplyArray()関数内部では、引数でもらった配列をループさせながら掛け合わせて、その結果を$num変数に格納しています。ということは、この$numが目的の値なのですが、それを関数の呼び出し元に返す必要があります。つまり、戻り値が$numの値なのです。

 このように、関数内の処理結果を戻り値として返す場合は「return」を使います。それが、(2)です。下記のようにすることで、この関数の呼び出し元に$numの値が戻り値として返されます。

retern $num;

 なお、戻り値に関しても、引数と同じく不要なこともあります。その場合は、returnは記述しません。

関数の処理内容は自由自在

 先に、「戻り値が不要なことがある」と書きましたが、実は、この辺りは「関数をどう作るか」で変わってきます。例えば、リスト4では「配列の各要素を掛け算した結果を戻り値として返す」というように処理内容を決めて関数を定義しています。これが、例えば、「配列の各要素を掛け算した結果を表示する」として定義すれば、表示までが関数に含まれます。すると、関数を呼び出す側では表示処理は不要となります。

 具体的には、以下のようなソースコードになります。useUserDefinedFunction2.phpを作成し、実行してください。

<?php
function multiplyArray2(array $array)
{
    $num = 1;
    foreach($array as $value) {
        $num *= $value;
    }
    print("配列の計算結果: ".$num);  // (1)
}
    
$list = [5, 4, 8, 6, 2, 9];
multiplyArray2($list);  // (2)
リスト4 phplesson/chap09/useUserDefinedFunction2.php

 実行結果はリスト3と同じです。

 リスト4で定義した関数multiplyArray2()の処理は、4〜7行目はリスト3のmultiplyArray()と同じもので、配列の各要素の掛け算を計算しています。その計算結果である$numをmultiplyArray()では戻り値として返していましたが、multiplyArray2()では「そのまま表示する」という定義です。そのため、multiplyArray2()では(1)のようにprint()処理を行います。また、戻り値が不要なのでreturnは記述しません。

 さらに、このmultiplyArray2()を使う際は戻り値がないので、(2)のように単に関数を呼び出すだけで、リスト3のように関数の戻り値を受け取る変数は不要です。

 なお、ここではmultiplyArray()とmultiplyArray2()の2種の関数を作成しましたが、このどちらが便利なのかはその時々によります。

 関数を作る際に、multiplyArray()とmultiplyArray2()がそうであったように、全体として同じような処理でも、さまざまな作り方が可能です。この辺りはシステム全体の設計とかかわってきます。

 本連載は、PHPプログラムの書き方に焦点を当てたものであるため、詳しくは述べませんが、自分で関数を作成する際は「全体のシステムの中でどのような関数を定義すると便利か」という視点で考えていく必要があります。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。