最後に、関数の再利用についてもう少し見ていきましょう。
例えば、リスト3で定義したmultiplyArray()ですが、この関数はuseUserDefinedFunction.phpに記述されており、このファイル内でしか使えません。せっかく、処理を再利用するために関数を定義しても、他から利用できないのはもったいないことです。
そこで、再利用できるようにこれら関数を1つのファイルにまとめ、関数を使うphpファイルでは関数が書かれたファイルを読み込む方法を採ります。実際にコーディングしてみましょう。
まず、関数をまとめたfunctions.phpファイルを作成しましょう。
<?php function multiplyArray(array $array): float { $num = 1; foreach($array as $value) { $num *= $value; } return $num; } function multiplyArray2(array $array) { $num = 1; foreach($array as $value) { $num *= $value; } print("配列の計算結果: ".$num); }
リスト3記載のmultiplyArray()とリスト4記載のmultiplyArray2()を丸々コピーしただけのファイルです。このように、関数名さえ重ならなければ、1つのファイルに幾つでも関数を記述できます。なお、このファイルは関数を定義しただけのファイルなので、ブラウザから実行しても何も起こりません。
次に、このファイルを読み込んで実行するphpファイルを作成しましょう。
<?php require_once("functions.php"); // (1) $list1 = [5, 4, 8, 6, 2, 9]; $result = multiplyArray($list1); print("配列の計算結果: ".$result."<br>"); $list2 = [7, 5, 9, 1, 3, 6]; multiplyArray2($list2);
実行結果は下記の通りです。
配列の計算結果: 17280 配列の計算結果: 5670
4行目以降はリスト3や4とほぼ同じです。ただし、それぞれ別の配列にするために、変数名を変更しているのと、2個目の配列($list2)の中身を1個目とは別にしています。
ここで新しい記述は(1)です。このrequire_once()という処理で別ファイルに記述したfunctions.phpを読み込んでいます。試しにこの1行をコメントアウトしてuseFunctions.phpを実行すると、以下のように表示されます。
Fatal error: Uncaught Error: Call to undefined function multiplyArray() in C:\xampp\htdocs\phplesson\chap09\useFunctions.php:5 Stack trace: #0 {main} thrown in C:\xampp\htdocs\phplesson\chap09\useFunctions.php on line 5
内容は「定義されていない関数であるmultiplyArray()を呼び出しています」となっています。つまり、外部ファイルに記述されたmultiplyArray()を認識していないのです。これを認識するためには、やはり(1)の記述が必要なのです。
今後、関数など外部ファイルに定義を記述し、それを読み込んで使う場面が増えてきます。その際は、require_once()の()内にそのファイルのパスを記述すると思ってください。
なお、今回はfunctions.phpがuseFunctions.phpと同じフォルダ内にあるので、ファイル名だけ記述していますが、functions.phpが別フォルダ、例えば、「chap09」配下の「funcs」フォルダ内にあるとするなら、下記のように記述します。
require_once("funcs/functions.php");
外部phpファイルを読み込む処理として、ここではrequire_once()を使いましたが、require_once()の他に、require()、include()、include_once()の合計4個あります。
これらの違いは、下記の2点です。
読み込み済みチェックとは、その読み込み対象のファイルが、それ以前にrequire()やinclude()されたかどうかをチェックすることです。onceがない方のrequire()やinclude()では、この処理を記述するたびにファイルの読み込み処理が行われます。
本稿のサンプルでは、関数定義のファイルのみなので、一度だけ読み込まれても何度も読み込まれてもあまり違いは分かりませんが、読み込み先ファイルに例えばprint()などの表示処理が含まれていた場合、onceが付いていない方のrequire()やinclude()では、そのたびごとに表示処理が行われてしまいます。
表にすると下記の通りです。
命令 | エラー | チェック |
---|---|---|
require() | ◯ | × |
require_once() | ◯ | ◯ |
include() | × | × |
include_once() | × | ◯ |
この表からrequire_once()を使うといいということが分かるでしょう。
関数について、特に引数や戻り値についてはもう少し掘り下げたいところですが、いったん横に置いておいて、次回は変数の有効範囲について解説します。
Copyright © ITmedia, Inc. All Rights Reserved.