プログラム例として,"OBJECT-ORIENTED PHP"(P. Lavin著, NO STARCH PRESS)という書籍に載っている例を参考にした
この書籍で紹介されているプログラムは著者のWebページ
http://objectorientedphp.com/ からプログラムがダウンロードできる.
「クラス」は,あるまとまった機能を実現する関数(言語によってはメソッドと呼ぶ)と,変数(属性)を定義したものある.下図参照(図は「独習PHP」より)
クラスを実際にプログラム中で使用するには,クラス定義に基づく実体(インスタンス)を生成する.クラスは,実体をつくる設計図と考えればよい.クラス定義にある変数は,各インスタンスごとに値をもつ(共有する値を用いる方法もある:後述).下図参照(図では実体をオブジェクトと呼んでいる.)
1. クラスは
class DirectoryItems { //data members var $filearray = array(); ...変数群(プロパティ)の定義 function aaaa(x,y) { 関数aaaa } .... 関数群(メソッド)の定義 }のように宣言する.(変数$filearrayはこの節の例で実際に利用される.)
2. ある実行プログラムにおいて、クラスで定義された「もの」(オブジェクトと呼ぶ)を 利用するには、その「もの」をつくる作業が必要である。作る作業をインスタンス化と呼ぶ。インスタンスの生成は, new演算子 を用いる.
$di = new DirectoryItems('graphics');
3. つくられたインスタンスは、実体としていくつかの変数(その実体の属性を記録する場所)と機能(関数)をあわせ持つ。それらをインスタンスのメンバー変数、メンバー関数などと呼ぶ。メンバーにアクセスする演算子は, ->
である。
下のような DirectoryItems.php を利用してみる. この内容をDirecoryItems.phpという名前で,各自のディレクトリに置く.
<?php class DirectoryItems{ //data members private $filearray = array(); private $types = array(); //////////////////////////////////////////////////////////////////// //constructor //////////////////////////////////////////////////////////////////// public function __construct($directory, $file_extensions){ if(isset($file_extensions) && count($file_extensions)!=0) { $this->types= $file_extensions; } else { array_push($this->types, "csv"); } $d = ''; if(is_dir($directory)) { $d = opendir($directory) or die("Couldn't open directory."); while(false !== ($f=readdir($d))) { if(is_file("$directory/$f")) { $extension = substr($f,(strpos($f, ".")+1)); $extension = strtolower($extension); if(in_array($extension, $this->types)){ $this->filearray[]="$directory/$f"; } } } closedir($d); }else{ //error die('Must pass in a directory.'); } } //////////////////////////////////////////////////////////////////// //public functions //////////////////////////////////////////////////////////////////// public function indexOrder(){ sort($this->filearray); } //////////////////////////////////////////////////////////////////// public function naturalCaseInsensitiveOrder(){ natcasesort($this->filearray); } //////////////////////////////////////////////////////////////////// public function getCount() { return count($this->filearray); } //////////////////////////////////////////////////////////////////// public function getFileArray(){ return $this->filearray; } }//end class //////////////////////////////////////////////////////////////////// ?>
このプログラムは,あるディレクトリを走査し,必要なファイル名を取り出す関数を含んだクラスである.(ディレクトリ名はインスタンス生成時点に指定する.)
クラスの内容(コンストラクタ,各関数の役割)を理解した上で,csv形式の ファイルを抜き出す関数を備えたクラスにし,このクラスを利用して課題2の 課題をおこなってみよう.
次のように$dirというオブジェクトをつくり,そのメンバー関数getFileArray()を使ってファイルの名前を$filesという配列に格納する.
<?php include_once "DirectoryItems.php"; $dir = new DirectoryItems("../data", array("csv")); $files = $dir->getFileArray(); foreach($files as $f) { echo $f . "<br>"; } ?> ファイルが受け取れていることを確かめてから,次の作業に入る.