目次
前節で行った複数のファイル読込みデータを表として表示するプログラムのうち、ファイルの一覧を取得する部分をプログラム本体から切り離して,関数で定義し、それをメイン文で使用するプログラムの練習をする.
大きなアプリケーションをつくるには,部分的な機能を関数として定義することと,それを本体のスクリプトとは別のファイルとして作成することが便利である.
たとえば、PHP入門のページで関数の勉強をしてみよう.
授業では,e-Learningにアップしたテキストの2.8節を用いて説明する.
課題4のプログラムを次のように書き直してみよう.
<body> <?php $dir = "../data/"; $files = getDir($dir,".csv"); //下で定義する関数を実行し、csvファイル一覧を配列として受け取る。 // getDirがうまく書かれているかどうかをチェックするために、 // 下のforeachブロックを作る前に、print_r($files)をここに書いてチェックしてみる。 foreach($files as $file) { $handle = fopen($dir . "/" . $file); //$fileを開く //CSVデータの処理をする.(課題3と同じ) } ?> </body> <?php function getDir($dir_name, $extension) { // $dir_nameで与えられたディレクトリを走査し,拡張子が$extensionに合致 // するファイル名を配列として返す $files = array(); $dirHandle = opendir($dir_name); while($file = readdir($dirHandle)) { // $file がCSVファイルだったら $files に追加するプログラムを書く } return $files; } ?>
上記のように関数定義を用いて課題4のプログラムを書き直してみよう. [1/11]
途中のチェックポイントとして、foreachを書かずににprint_rを入れたときの出力例
関数の部分は,同じファイルに書いてもよいが,長い場合は次のように別ファ イルに書き,それをinclude文で取り込むのが便利である.
<body> <?php ini_set("display_errors","On"); include "dir_function.php"; $dir = "../data/"; $files = getDir($dir,".csv"); foreach($files as $file) { $fileを開き,CSVデータの処理をする.(課題3と同じ) } ?> </body>
<?php function getDir($dir_name, $extension) { $dir_nameで与えられたディレクトリを走査し,拡張子が$extensionに合致 するファイル名を配列として返す } ?>
C言語と同様だが,関数の中で用いる変数は,外部で定義された変数とは (名前は同じでも)別物である.
<?php $a = 1; // グローバルスコープ Test(); function Test() { echo $a; // ローカルスコープ変数の参照 } ?>
関数中の$aはメインのスクリプトで定義された$a=1とは別物です.したがって, このスクリプトは何も出力しない.
関数の中で,変数名をglobal宣言すると,外部で宣言された変数と同じものに なる.
<?php $a = 1; $b = 2; Sum(); echo $b; function Sum() { global $a, $b; $b = $a + $b; } ?>このスクリプトでは3を出力する.
大きなプログラムだとglobal宣言を多用すると混乱の原因になるので,必要最 小限でかつ分かりやすい変数名とするべきである.