2017.7.2
日記システム再構築計画#2-glob()によるファイル取得-
そろそろ本腰入れてプログラムも書きたいところです。
が、しかし僕はその前にやらなくてはならないことがあります。日記システムのリファインですね。
必須かどうかと言われれば必須ではないのですが、新規機能の追加のし辛さは前々から感じていたので、クラス化してスマートにしたいなという話は
しました。
とりあえず生誕25周年というキリがいいところに新システムを持っていきたいところですね。
さて、今回ご紹介したいのは
glob()という関数です。
これはファイルを取ってくる関数なのですが
ワイルドカードが使えるという特性があります。
ご存知の方もいるかも知れませんが、うちの日記の画像ファイルetcは
./Pictures/(日)_(通し番号).xxxで管理されています。
つまり、日付と通し番号さえ渡せば自動的にファイルを取ってくる、という関数が作れないこともないんですね。
しかし問題なのが拡張子の部分。今までは直接指定して取ってきてましたが、ワイルドカードが使えればその心配が無用になりますね。
ということで、実装してみます。
Class Diary{
/*時間データ*/
private $time;//Time型
public $date;//Datetime(その日の00:00:00)
public $yy;
public $yyyy;
public $m;
public $mm;
public $d;
public $dd;
/*汎用メソッドデータ*/
private $f;
/*記事内部データ*/
public $exist = false;
public $index = array();//自身のインデックスデータ
public $img_count = 1;//画像カウンタ
public $title_count = 0;//タイトルカウンタ
public $home_now = false;
public $u_h;
//DateTimeオブジェクトを受け取り、各変数に登録する
function __construct($date,$u_h="../../../"){
$this->time = new Time($date);
$this->date = $this->time->date;
$this->yy = $this->time->yy;
$this->yyyy = $this->time->yyyy;
$this->m = $this->time->m;
$this->mm = $this->time->mm;
$this->d = $this->time->d;
$this->dd = $this->time->dd;
$this->u_h = $u_h;
//存在判定とインデックス登録
$this->exist = $this->exist();
//ファンクション登録
$this->f = new DiaryFunction($this);
}
}
class DiaryFunction {
private $diary; // 内部参照用
function __construct($diary) {
$this->diary = $diary;
}
function getPictureURL(){
$d=$this->diary;
foreach(glob($d->u_h.'Diary/'.$d->yyyy.'/'.$d->mm.'/Pictures/'.$d->d.'_'.$d->img_count.'.*') as $file){
if(is_file($file)){
$d->img_count++;
return $file;
}
}
}
function img($size=""){
echo 'src="'.$this->getPictureURL().'"';
if(!empty($size)){
echo ' width="'.$size.'"';
}
}
}
実はこんな構造になってるんですね(笑)
Diaryクラスが日記のデータを集約したクラスになっており、各種関数はFunctionクラスで扱うことにしています。
ただ、コンストラクタでDiaryクラスのインスタンスの参照をコピーすることで、Diary型インスタンスに入ってるデータを容易に取り出せるようにしています。
ちなみに、完全に個人開発なプログラムなので
メンバ変数はpublicだらけというとてもお行儀の悪いクラスです(笑)
とにかく文字数が少なくなるように設計してます。だからいちいち敢えてインスタンスを変数に入れたりしてるんですけどね。
んで、今回の肝となっているのはFunctionの9行目。ここに今回見せたいglob関数がありますね。
こうすることで、拡張子が不明なファイルでも容易に取得することができ、ぐっと見た目も綺麗になります。
これで日記の本文がどう変わるのかというと・・・・・・
例えばjpg画像を表示させる際・・・・・・
こうしてたのが・・・・・・
これで事足りるようになるんですね。
ね!?画期的でしょ!?!?←
必要な情報は全てオブジェクトが覚えててくれるってのがクラス化する最大の利点なのです!!!!
まぁ当たり前のことなんですけど、プログラミングを知らない人にとっては、ほへーすごいなーとか思ってもらえるんじゃないでしょうか!?!?ね!?!?!?
もちろん、こうすれば横幅も指定できるように作ってます(笑)
あと、ワイルドカード指定なので画像ファイル以外も呼び出せるので、imgタグと結びついてるimgメソッドではなくまた別のメソッドを定義すれば、動画ファイルや音楽ファイルなんかも読み込めたりします。ね、すごいでしょ?????????
という楽しいことを頑張っているのです。(笑)