関数(function)と外部スクリプトの組み込み(include)

目次

関数の定義
課題6
複数のファイルで構成する
メインのスクリプト
関数を定義したスクリプト: dir_function.php
変数のスコープ
global宣言

前節で行った複数のファイル読込みデータを表として表示するプログラムのうち、ファイルの一覧を取得する部分をプログラム本体から切り離して,関数で定義し、それをメイン文で使用するプログラムの練習をする.

大きなアプリケーションをつくるには,部分的な機能を関数として定義することと,それを本体のスクリプトとは別のファイルとして作成することが便利である.

たとえば、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;
}
?>

課題6

上記のように関数定義を用いて課題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>
関数を定義したスクリプト: dir_function.php
<?php
function getDir($dir_name, $extension) {

  $dir_nameで与えられたディレクトリを走査し,拡張子が$extensionに合致
  するファイル名を配列として返す

}
?>

変数のスコープ

C言語と同様だが,関数の中で用いる変数は,外部で定義された変数とは (名前は同じでも)別物である.

<?php
$a = 1; // グローバルスコープ
Test();

function Test() {
    echo $a; // ローカルスコープ変数の参照
}
?>

関数中の$aはメインのスクリプトで定義された$a=1とは別物です.したがって, このスクリプトは何も出力しない.

global宣言

関数の中で,変数名をglobal宣言すると,外部で宣言された変数と同じものに なる.

<?php
$a = 1;
$b = 2;

Sum();
echo $b;

function Sum()
{
    global $a, $b;
    $b = $a + $b;
}
?>
このスクリプトでは3を出力する.

大きなプログラムだとglobal宣言を多用すると混乱の原因になるので,必要最 小限でかつ分かりやすい変数名とするべきである.