PHPの「関数」で処理を共通化して再利用する――プログラミングの幅をぐっと広げよう:Web業界で働くためのPHP入門(9)(3/3 ページ)
オープンソースのWeb開発向けスクリプト言語「PHP」の文法を一から学ぶための入門連載。今回は、PHPの関数について解説します。
別のファイルに関数を記述する
最後に、関数の再利用についてもう少し見ていきましょう。
例えば、リスト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つのファイルに幾つでも関数を記述できます。なお、このファイルは関数を定義しただけのファイルなので、ブラウザから実行しても何も起こりません。
関数をまとめたファイルを読み込むrequire_onceメソッド
次に、このファイルを読み込んで実行する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");
コラム「requireとincludeとonce」
外部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.
関連記事
- WordPress活用に欠かせない、PHPをWindowsにダウンロードしてインストール、アンインストールする
本連載では、さまざまなソフトウェアのインストール、実行するためのセットアップ設定、実行確認、アンインストールの手順を解説する。今回は、PHPとは何か、PHPで動くツールの紹介、PHPのインストールとアンインストールについて解説。PHPプログラミングを始める参考にしてほしい。 - PHPにおけるクラスの書き方と呼び出し方――インスタンス、メソッド、プロパティ
「PHPで、どのようにオブジェクト指向プログラミングをしていくか」を解説する連載。初回は、「クラス」の書き方と簡単な使い方、メソッド/クラス定義内関数、プロパティ/クラス定義内変数、マルチプルインスタンスについて紹介します。 - PHP(スクリプト言語)
PHPは、HTMLへの埋め込みが可能なスクリプト言語(およびその処理系)。主としてWebアプリ開発に使用される。