昨日スパなんかにいったせいで予定が大幅に遅れていますので、今日は筋トレなんかせずに予定を回復させる方針で行きたいと思います。これで3時間ぐらいは確保できますね。
いま頭を悩ませてる問題のひとつとして
Time型を扱えるライブラリがないということです。
軽く探してみたんですが、日付時刻なら
Carbonという人気のライブラリが標準で付属しているみたいなので、それを使ってみようと思うのですが、時刻だけとなるといい感じのものがなかったので、財産として作ってみることにしました。
やりたいことは以下です。
・文字列表記と、配列の両対応
・簡単なバリデーション
・コンストラクタに値をぶっ込んだ時点で全ての準備が整う
ということで、突貫工事で作ってみたわけです。
/*時間情報を扱うクラス*/
class Time{
private $hh = null;
public function get_hh(){
return $this->hh;
}
private $h = null;
public function get_h(){
return $this->h;
}
private $mm = null;
public function get_mm(){
return $this->hh;
}
private $m = null;
public function get_m(){
return $this->m;
}
private $ss = null;
public function get_ss(){
return $this->ss;
}
private $s = null;
public function get_s(){
return $this->s;
}
public function get_Array(){
return array($this->h,$this->m,$this->s);
}
public function get_Array_hm(){
return array($this->h,$this->m);
}
public function get_Array_00(){
return array($this->hh,$this->mm,$this->ss);
}
public function get_Array_hm_00(){
return array($this->hh,$this->mm);
}
private $string =null;
public function get_String(){
return $this->string;
}
private $string_hm =null;
public function get_String_hm(){
return $this->string_hm;
}
public function __construct($var) {
if(is_array($var)){
$this->generate_from_Array($var);
}else{
$this->generate_from_Time($var);
}
}
private function initialize(){
$this->hh = "00";
$this->h = 0;
$this->mm = "00";
$this->m = 0;
$this->ss = "00";
$this->s = 0;
}
private static function addingZero($int):String{
if(empty($int)){return "00";}
if(($int+0)<10){
return "0".($int+0);
}
return (String)$int;
}
private static function stripZero($str):int{
if(empty($str)){return 0;}
return $str+0;
}
private function generate_hms($array_hms){
$this->hh = Time::addingZero($array_hms[0]);
$this->h = Time::stripZero($array_hms[0]);
$this->mm = Time::addingZero($array_hms[1]);
$this->m = Time::stripZero($array_hms[1]);
if(isset($array_hms[2])){
$this->ss = Time::addingZero($array_hms[2]);
$this->s = Time::stripZero($array_hms[2]);
}
}
private function generate_string(){
//配列に格納された値から文字列を生成
$this->string = $this->hh.":".$this->mm.":".$this->ss;
$this->string_hm = $this->hh.":".$this->mm;
}
public function generate_from_Time($str){
if(!preg_match('/\A([0-9]+:[0-5]?[0-9]{1}|[0-9]+:[0-5]?[0-9]{1}:[0-5]?[0-9]){1}\z/', $str) ){
//正規表現に一致しないため、falseを返して終了。
return null;
}
$this->initialize();//正常なデータなので、初期値を代入
$this->generate_hms(explode(":", $str));
$this->generate_string();
}
private static function is_integer_check($var){
if(is_int($var)){return true;}
if(ctype_digit($var)){return true;}
return false;
}
public function generate_from_Array($array){
//数値かどうかのバリデーション
if(!Time::is_integer_check($array[0])){return null;}//「時」がnullのパターンは存在しない(「分」はnullを受け付ける)
if(isset($array[1]) && !Time::is_integer_check($array[1])){return null;}//「分」はnullと数値を許容
if(isset($array[2]) && !Time::is_integer_check($array[2])){return null;}//「秒」も同様
//正常値かどうかのバリデーション
if($array[0]<0){return null;}
if(isset($array[1])){ if(!(0<=$array[1] && $array[1]<60)){return null;} }
if(isset($array[2])){ if(!(0<=$array[2] && $array[2]<60)){return null;} }
$this->initialize();//正常なデータなので、初期値を代入
$this->generate_hms($array);
$this->generate_string();
}
}
class TimeComparer{
private $time1;
private $time2;
public function __construct(Time $time1,Time $time2) {
$this->time1 = $time1;
$this->time2 = $time2;
}
public function is_confirm(){
//どちらか片方が未指定であれば通す
if($this->time1->get_String() === null){return true;}
if($this->time2->get_String() === null){return true;}
//時間1>時間2は問題なのでエラー
if($this->time1->get_h() > $this->time2->get_h()){return false;}
if($this->time1->get_h() == $this->time2->get_h()){
//「時」が共に同じなら「分」で比較
if($this->time1->get_m() > $this->time2->get_m()){return false;}
}
return true;
}
}
こんな2つのクラスを半日かけて作ってみました。ちなみに使う範囲以外でちゃんと動作確認はしてません。(!?)
とりあえず、時刻を扱うインスタンスをとりあえずコンストラクタにぶっこめば、関連した情報を勝手に作ってくれる、っていうイメージで作ってます。
ただ、キャスト回りでだいぶ迷走してて、ほんとにこれが正解なのかよくわからない感じになってますが、まぁ僕が使う用だし...笑
ちなみに、プログラミングのお作法に全く則っていない書き方してるので、プロの方が見たら怒られる書き方なのでこんなプログラマにならにようにしてくださいね←
やー、twitterとかではちょくちょくつぶやいた気がするんですけど、僕はどうやらプログラムを書くのが嫌いなようだ(笑)
別にプログラムが好きで書き始めたわけじゃないですからね。最初から一貫して「手段」でしかないし。手っ取り早く成功するには自分でプログラム書いて面白いサービス作ればいいじゃんって思って勉強しただけですしね。それが今になって活きてるのはおもしろいですけど。当初と全然見据えるルート変わっちゃいましたけど(笑)
最初は無料のSNS作って、同時進行で演奏してみたとかで売名行為を働いて、自らが広告塔になることで拡散を狙おうと思ってたんだけどなぁ、、、
まぁ僕のパーソナリティが色んな人に全否定されちゃったしね、しょうがないね
はやくビジネスのことだけに頭回せるようになりたいなぁほんと。コード書く才能はないわ自分。バグフィクスきらいだし。(笑)
とりあえず、トップページに載せてる通り、一日でアクティベーションを完成させました。まぁ言うて元々の基盤は作ってましたし、あとはメールアドレス認証を完成させるだけで良かったですしね。
お次はホスト検索・・・・・・つまり、宿の検索です。GoogleMapsAPIとか絡むので、ぶっちゃけ2日で完成とか無理だと思ってます()
その次の予約ハンドシェイクも、ビジネスフローが若干ふんわりしてたような気がしてて、これも以外なところで引っかかりそうですね。
ただ、ここまで作っちゃえばプロトタイプとしては上出来で、最悪キャンセルは実装しない、という思い切った選択もできますね。まぁ一応作っておくつもりではいますけど・・・・・・。