クラスとオブジェクト1 ディレクトリ操作を例に

プログラム例として,"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
////////////////////////////////////////////////////////////////////
?>

このプログラムは,あるディレクトリを走査し,必要なファイル名を取り出す関数を含んだクラスである.(ディレクトリ名はインスタンス生成時点に指定する.)

[演習8]

クラスの内容(コンストラクタ,各関数の役割)を理解した上で,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>";
}
?>

ファイルが受け取れていることを確かめてから,次の作業に入る.