業務アプリ開発講座

動的にrequire_onceする方法

includesディレクトリ内のphpファイルを動的にrequire_onceするよう、Init.phpに関数requireAll()を作成します。

開発を進めていくとclassをたくさん作っていくことになりますし、classの数と同じだけclassを記述したphpファイルも増えていきます。新しくclassを追加するたびにその他のプログラムを修正するのは面倒です。そこで必ずrequire_onceするInit.php内で、指定のディレクト内のphpファイルを自動でrequire_onceするようにして、classファイルを追加するだけで、自動でrequire_onceされるよにしてしまいます。

それではInit.phpに下記ソースを追記します。

requireAll('classes');
requireAll('temp-html');
requireAll('temp-sql');

function requireAll($dirName){

	$dirPath	= $GLOBALS["path"]["root"].'/includes/'.$dirName.'/';

	if(!is_dir($dirPath))           errorLog("not dir [{$dirPath}]");
      if(!$dir = opendir($dirPath))   errorLog("not open [{$dirPath}]");

	while($file = readdir($dir)){
		if(!is_dir($file) && strrpos($file, '.php')){
			require_once($dirPath.$file);
		}
	}
	closedir($dir);
}

先にfunction requireAll($dirPath)を解説します。

require_onceするファイルはすべてincludesディレクトリ内に置くルールにしています。ですので、引数$dirNameにはincludesディレクト内のディレクトリ名を受け取れば良いことになります。

最初の変数$dirPathは引数で受け取ったディレクト名の絶対パスを代入しています。ここでは、rootパスにincludesと$dirNameを連結して生成していますが、あらかじめincludesディレクトリの$GLOBALS変数を生成しておいても良いでしょう。そうすると

$dirPath = $GLOBALS["path"]["includes"].$dirName.'/';

と記述することもできます。ただ、$GLOBALS変数でclassesディレクトりパスを設定しておいてもInit.php以外で使い道がありませんので、ここでは、$GLOBALS変数は生成しないことにします。

if(!is_dir($dirPath))  errorLog("not dir [{$dirPath}]");

変数$dirPathがディレクトリではない場合は処理を中断します。これだけ見通しの良いソースですので、不要な処理とも言えます。関数の定義のすぐ上でその関数を読んでいて、引数$dirNameにはディレクトリ名が必ず入ってくることは明白ですね。たとえディレクトリ名を間違えて入力したとしても、エラーが発生してディレクトリ名が正しくないことはすぐにわかりますし、そこで直してしまえば、今後エラーが発生することはない箇所です。ですが、今後の勉強のためにここではこのチェック処理を残しておきます。

if(!$dir = opendir($dirPath))   errorLog("not open [{$dirPath}]");

これは、開発段階と本番環境に移行した際に必要なチェックです。何かしらの設定ミスでディレクトリに読み取りアクセス権限がない場合が考えられるからです。そして、ディレクトリ開くことに成功した場合、ディレクトリオブジェクトを返します。

while($file = readdir($dir)){}

ディレクトリオブジェクトの中身を順番に読み込んでいきます。変数$fileにはディレクトリに含まれるすべての要素は入ってきます。ファイルはもちろん、サブディレクトも存在すれば入ってきます。

if(!is_dir($file) && strrpos($file, '.php'))

ですので、この条件式が必要になるわけです。条件は、変数$fileがディレクトリではなく、且つ末尾が.phpである場合となり、つまりphpファイルである場合はという意味になります。

require_once($dirPath.$file);

そして、ディレクトりパスにファイル名を連結したファイルの絶対パスを生成してrequire_once()します。

requireAll('classes');
requireAll('temp-html');
requireAll('temp-sql');

関数requireAll()を呼び出すとき、サブディレクトリを指定しています。例えば、

requireAll();

として、includes内のすべてのphpファイルをrequire_onceしても良いのではないかと思われるかもしれません。確かにそれも一つの方法です。しかし、PDF生成ライブラリやバーコード生成ライブラリが格納されているディレクトリであるBarcode2mPDF60はそれぞれ、PDFを生成する画面、バーコードを生成する画面でしか使用しない特殊なプログラムです。ですので、そのプログラム上でのみ、読み込めばよいわけです。そのあたりを柔軟に対応できるようにあえて、includesディレクトリ内の読み込むべきサブディレクトリを指定するようにしています。

ここで一つ訂正があります。

関数errorLog()ですが、classAppDataからInit.phpへ移動します。

次回は、パンくずリストをプログラミングします。