以下の記事で、クラス(class)のオーバーライドの使い方について説明してきました。
⇒PHP クラス(class)の使い方について
⇒PHP クラス(class)のオーバーライドの使い方について・その2
そこで、今回は簡単なクラスでの説明ではなく、少し有用性があるクラスを作成し、それを元にオーバーライドの使い方について説明します。
以下のクラスは PHPExcel ライブラリを利用して指定されたエクセルファイルをオープンし、全ての行を順次読込むためのクラスです。 メソッドとしては以下の4個を持ちます。
- コンストラクタ(__construct):ファイルを指定してインスタンス生成
- ファイルオープン(open):ファイルをオープンして各種属性を取得
- カラムMAX取得(getColMax):カラムの最大値を返す
- 1行データ取得(getLine):データが存在した場合は配列データを返す(最後を超えた場合はfalse)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | <?php // Excelライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php' ; // Excelファイル読込クラス[cExcelGet.php] class cExcelGet { // 共通変数宣言 private $strFilePath ; // ファイルフルパス名退避 // エクセル用カラム名 private $arrColName = array ( // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 "A" , "B" , "C" , "D" , "E" , "F" , "G" , "H" , "I" , "J" , "K" , "L" , "M" , "N" , "O" , "P" , "Q" , "R" , "S" , "T" , "U" , "V" , "W" , "X" , "Y" , "Z" , "AA" , "AB" , "AC" , "AD" , "AE" , "AF" , "AG" , "AH" , "AI" , "AJ" , "AK" , "AL" , "AM" , "AN" , "AO" , "AP" , "AQ" , "AR" , "AS" , "AT" , "AU" , "AV" , "AW" , "AX" , "AY" , "AZ" , "BA" , "BB" , "BC" , "BD" , "BE" , "BF" , "BG" , "BH" , "BI" , "BJ" , "BK" , "BL" , "BM" , "BN" , "BO" , "BP" , "BQ" , "BR" , "BS" , "BT" , "BU" , "BV" , "BW" , "BX" , "BY" , "BZ" , ); // ワークシートオブジェクト取得 private $objWorksheet ; private $intLine ; // データ行数 private $intColMax ; // カラムMAX数 private $intRowMax ; // 行MAX数 // コンストラクタ // [引数] $_strFilePath string : ファイルフルパス名 public function __construct ( $_strFilePath ) { // ファイルフルパス名を退避 $this ->strFilePath = $_strFilePath ; } // ファイルオープン // [戻り値] :true:正常、false:エラー public function open() { // ファイル存在チェック if (! file_exists ( $this ->strFilePath)) { // ファイル存在エラー return false; } // エクセルファイル読込オブジェクト $objReader = PHPExcel_IOFactory::createReader( "Excel2007" ); // PHPExcelオブジェクト取得 $objPHPExcel = $objReader ->load( $this ->strFilePath); // ワークシートオブジェクト取得 $this ->objWorksheet = $objPHPExcel ->getActiveSheet(); // カラムMAX取得 $strColMax = $this ->objWorksheet->getHighestColumn(); // カラム文字列 $this ->intColMax = PHPExcel_Cell::columnIndexFromString( $strColMax ); // 行MAX取得 $this ->intRowMax = $this ->objWorksheet->getHighestRow(); // データ行数 $this ->intLine = 0; // 正常 return true; } // カラムMAX取得 public function getColMax() { return $this ->intColMax; } // 1行データ取得 // [戻り値] :データが存在した場合は配列データ // (array("A" => "aaa", "B" => "bbbb")の様にカラム文字列でアクセス可能 ) // :false:行最終 public function getLine() { // データ行数 $this ->intLine++; if ( $this ->intLine > $this ->intRowMax) { // 処理行数がMAXを超えた場合 return false; } // 1行データ取得・行指定 $arrData = $this ->getLineDirect( $this ->intLine); // データ配列を返す return $arrData ; } // 1行データ取得・行指定 // [引数] $_intLine : 行番号(PHPExcelでは行は1~) // [戻り値] :データが存在した場合は配列データ // (array("A" => "aaa", "B" => "bbbb")の様にカラム文字列でアクセス可能 ) // :false:行最終 public function getLineDirect( $_intLine ) { $arrData = array (); for ( $c = 0; $c < $this ->intColMax; $c ++) { //colは [0] 始まりで [0] = "A" となる(rowは [1] 始まり) $arrData [ $c ] = $this ->objWorksheet->getCellByColumnAndRow( $c , $_intLine )->getValue(); if ( is_null ( $arrData [ $c ])) { $arrData [ $c ] = "" ; } else { $arrData [ $c ] = trim( $arrData [ $c ]); } // 変換後のキーと値で設定 $arrData [ $this ->arrColName[ $c ]] = $arrData [ $c ]; } // データ配列を返す return $arrData ; } } ?> |
このクラスを使って以下のエクセルを読込んでみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php // クラスファイル読込 require_once 'cExcelGet.php' ; // [cExcelGet]クラスの生成 $insXlsx = new cExcelGet( "ctest1.xlsx" ); // ファイルオープン if ( $insXlsx ->open() == true) { // 1行データ取得 while ( $arrData = $insXlsx ->getLine()) { $str = "" ; for ( $i = 0; $i < $insXlsx ->getColMax() ; $i ++) { if ( $str != "" ) $str .= "," ; $str .= $arrData [ $i ]; } $str .= "<br>\n" ; echo $str ; } } else { echo "open error." ; } ?> |
これを実行するとブラウザに以下の様に表示されます。
1 2 3 4 | AAAA,BBBBB,CCC,DD 123,2000,4000,500 ABC001,B001,5000,140 C001,D002,600,200 |
このクラスを少し改良して、CSVファイルの場合に使用できる様にします。 尚 PHPExcel ライブラリのCSVファイル処理を利用します。(以下の記事を参照して下さい)
⇒PHP PHPExcel CSVファイルの読み込み・書き込みについて
上記の記事から、CSVファイルを読込んで PHPExcelオブジェクト を取得すれば、今回のクラスを親クラスとして利用できることが分かります。
それでは、その前に元のクラスを以下の様に変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | <?php // Excelライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php' ; // Excelファイル読込クラス class cExcelGet { // 共通変数宣言 protected $strFilePath ; // ファイルフルパス名退避 // エクセル用カラム名 private $arrColName = array ( // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 "A" , "B" , "C" , "D" , "E" , "F" , "G" , "H" , "I" , "J" , "K" , "L" , "M" , "N" , "O" , "P" , "Q" , "R" , "S" , "T" , "U" , "V" , "W" , "X" , "Y" , "Z" , "AA" , "AB" , "AC" , "AD" , "AE" , "AF" , "AG" , "AH" , "AI" , "AJ" , "AK" , "AL" , "AM" , "AN" , "AO" , "AP" , "AQ" , "AR" , "AS" , "AT" , "AU" , "AV" , "AW" , "AX" , "AY" , "AZ" , "BA" , "BB" , "BC" , "BD" , "BE" , "BF" , "BG" , "BH" , "BI" , "BJ" , "BK" , "BL" , "BM" , "BN" , "BO" , "BP" , "BQ" , "BR" , "BS" , "BT" , "BU" , "BV" , "BW" , "BX" , "BY" , "BZ" , ); // ワークシートオブジェクト取得 protected $objWorksheet ; private $intLine ; // データ行数 private $intColMax ; // カラムMAX数 private $intRowMax ; // 行MAX数 // コンストラクタ // [引数] $_strFilePath string : ファイルフルパス名 public function __construct ( $_strFilePath ) { // ファイルフルパス名を退避 $this ->strFilePath = $_strFilePath ; } // ファイルオープン // [戻り値] :true:正常、false:エラー public function open() { // ファイル存在チェック if (! file_exists ( $this ->strFilePath)) { // ファイル存在エラー return false; } // エクセルファイル読込、ワークシートオブジェクト取得 $this ->openWorksheet(); // カラムMAX取得 $strColMax = $this ->objWorksheet->getHighestColumn(); // カラム文字列 $this ->intColMax = PHPExcel_Cell::columnIndexFromString( $strColMax ); // 行MAX取得 $this ->intRowMax = $this ->objWorksheet->getHighestRow(); // データ行数 $this ->intLine = 0; // 正常 return true; } // エクセルファイル読込、ワークシートオブジェクト取得 protected function openWorksheet() { // エクセルファイル読込オブジェクト $objReader = PHPExcel_IOFactory::createReader( "Excel2007" ); // PHPExcelオブジェクト取得 $objPHPExcel = $objReader ->load( $this ->strFilePath); // ワークシートオブジェクト取得 $this ->objWorksheet = $objPHPExcel ->getActiveSheet(); } // カラムMAX取得 public function getColMax() { return $this ->intColMax; } // 1行データ取得 // [戻り値] :データが存在した場合は配列データ // (array("A" => "aaa", "B" => "bbbb")の様にカラム文字列でアクセス可能 ) // :false:行最終 public function getLine() { // データ行数 $this ->intLine++; if ( $this ->intLine > $this ->intRowMax) { // 処理行数がMAXを超えた場合 return false; } // 1行データ取得・行指定 $arrData = $this ->getLineDirect( $this ->intLine); // データ配列を返す return $arrData ; } // 1行データ取得・行指定 // [引数] $_intLine : 行番号(PHPExcelでは行は1~) // [戻り値] :データが存在した場合は配列データ // (array("A" => "aaa", "B" => "bbbb")の様にカラム文字列でアクセス可能 ) // :false:行最終 public function getLineDirect( $_intLine ) { $arrData = array (); for ( $c = 0; $c < $this ->intColMax; $c ++) { //colは [0] 始まりで [0] = "A" となる(rowは [1] 始まり) $arrData [ $c ] = $this ->objWorksheet->getCellByColumnAndRow( $c , $_intLine )->getValue(); if ( is_null ( $arrData [ $c ])) { $arrData [ $c ] = "" ; } else { $arrData [ $c ] = trim( $arrData [ $c ]); } // 変換後のキーと値で設定 $arrData [ $this ->arrColName[ $c ]] = $arrData [ $c ]; } // データ配列を返す return $arrData ; } } ?> |
クラスの中で、子クラスから参照される変数と、子クラスによりオーバーライドされるメソッドを protected として宣言します。 そこで、protected の部分を作成しCSVファイル読込クラスを宣言します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <?php // CSVファイル読込クラス(エクセル読込クラスから派生) class cCsvGet extends cExcelGet { // コンストラクタ // [引数] $_strFilePath string : ファイルフルパス名 public function __construct ( $_strFilePath ) { parent::__construct( $_strFilePath ); } protected function openWorksheet() { // CSV読込クラス生成 $objReader = new PHPExcel_Reader_CSV(); // CSVファイルの文字コード:Shift-JIS $objReader ->setInputEncoding( 'SJIS' ); // 区切り記号(カンマ) $objReader ->setDelimiter( ',' ); // 文字列の囲み文字(") $objReader ->setEnclosure( '"' ); // シートの位置 $objReader ->setSheetIndex(0); // 読込の結果としてPHPExcelオブジェクトが返る $objPHPExcel = $objReader ->load( $this ->strFilePath); // ワークシートオブジェクト取得 $this ->objWorksheet = $objPHPExcel ->getActiveSheet(); } } ?> |
このクラスを使って以下のCSVファイルを読込んでみます。("ctest1.csv"ファイル)
1 2 3 4 | aaaaaaaaaa,bbbbbb,cccccccc,dd 123,456,1000,2000 a01,b01,2000 c02,d03,500,600 |
以下が読込を実行するソースです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php // クラスファイル読込 require_once 'cExcelGet.php' ; require_once 'cCsvGet.php' ; // [cCsvGet]クラスの生成 $insCsv = new cCsvGet( "ctest1.csv" ); // ファイルオープン if ( $insCsv ->open() == true) { while ( $arrData = $insCsv ->getLine()) { $str = "" ; for ( $i = 0; $i < $insCsv ->getColMax() ; $i ++) { if ( $str != "" ) $str .= "," ; $str .= $arrData [ $i ]; } $str .= "<br>\n" ; echo $str ; } } else { echo "open error." ; } ?> |
これを実行するとブラウザに以下の様に表示されます。
1 2 3 4 | aaaaaaaaaa,bbbbbb,cccccccc,dd 123,456,1000,2000 a01,b01,2000, c02,d03,500,600 |
以上、有用性があると言いましたが、特に使い勝手が良くないかもしれませんので、改良して使って頂ければと思います。
関連する記事
⇒PHP クラスの中の「return $this」について⇒PHP 配列(array)の使い方について(「添字配列」「連想配列」)
⇒PHP 配列(array)内に使う:$_POST[] のデータを配列に取得
⇒PHP クラス(Class)のプロパティの使い方について(__get(), __set())
⇒PHP クラス(Class)のプロパティの使い方についてその2(__get(), __set(), __isset(), __unset())
⇒PHP クラス(class)の使い方について
⇒PHP クラス(class)のオーバーライドの使い方について・その2
⇒PHP クラス(class)のオーバーライドの使い方について・その3
ショッピングサイト一通りを最初から自分で作ってみることで、PHPでのシステム開発を学べる入門書です。
コメント