ステップアップ備忘録

学習用備忘録

PHPとHTMLでカレンダーを作成してみる

今回はdotinstallのPHPの項目にある「Datetimeクラスを使ってphpでカレンダーを作成する」から。

今回は、気を付けたい(もしくは気になる)点や引っかかってもたついた点について

それぞれのタイトルに 気を付けたい(気になる)→ ☆ 引っかかった→ ◎

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

☆ 画面の作りこみ(html記述)

colspan → 行ごとにセルを結合

rowspan → 列ごとにセルを結合

« ,  » → HTMLエンエティ(特殊文字を表示する)

           これの場合は「<<」「>>」が表示される

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

◎ webページで確認する

いざ作ったものを確認しようとすると、permission deneidエラー表示に。

調べるとSELinuxというカーネルの制御機能が関係しているとのこと。

これは細かいアクセス制御を行いたいときに使う機能で、

CentOSFedoraなどのRedHat系のLinuxではデフォルトで有効になっている。

これのモードを変更することでページの確認が可能になる。

詳し内容は

eng-entrance.com

 上などを参照して、自分に合ったモードに変更する。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

CSS(スタイルシート)の設定

collapse → 隣接するセルのボーダーを重ねて表示する。

separate→ 隣接するセルのボーダーの間隔をあけて表示する。

二つとも『border-collapse:』の後に続ける、初期値はseparate

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

PHPで動的にカレンダーを作成する

DateTime → 日付と時刻をあらわす。

       PHP側であらかじめ定義をしてあるクラス(標準クラス)で

       クラス定義をしなくてもオブジェクトを生成できる。

DateInterval → 日付の間隔をあらわす。

        格納方式は固定値(年月日など)かDateTimeなどで使える相対書式

 

※DateTimeなどで使える相対書式はPHPの公式マニュアルを参照

PHP: 相対的な書式 - Manual

※相対書式を使う際は書き方に注意

 first day of this month → first day of December 2018などの具体的なほうがベスト

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

☆ 週ごとに行を変える

format → 指定された書式に置き換えて返す。

     0個以上の指示子(ディレクティブ)で構成される文字。

    format('Y-m-d')など。書式に決まりがあるので注意する。

    PHP: DateInterval::format - Manual

    上の公式マニュアルを参照

sprintf() → formatされた文字列を返す。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

☆ 翌月分のカレンダーの作成

$a .=  $b → aとb双方の演算結果をaに代入する

 DateTimeオブジェクト($firstDayOfNextMonthなどの)→add(new DateIntarval('P1D'))

→ 指定したDateIntervalオブジェクトを指定のDateTimeオブジェクトに加える

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

☆ ◎ 前月部分を作成する

($deteなど)                                    sub(new DateInterval('P10D')など

☆ DateTimeオブジェクト   →    sub(DateIntervalオブジェクト)

DateTimeオブジェクトからDateIntervalオブジェクト引くという意味

 

◎ この時のアロー演算子(→)についてパッと見て理解ができていなかったので調べた

前項の翌月分を作る際のaddも含めてこのアロー演算子が少し疑問。

アロー演算子(→)は、データを参照する(手元に呼び出して見られるようにする)形で使うのでそのもの自体を操作ができないと認識でいた。

(ここでいうDateIntervalオブジェクトの値('P10D'のような)は参照しているのでその値を他(任意の変数)に代入せずに使うことはできないという認識)

 

その為に左辺に右辺を加える(加算)、左辺から右辺を引く(減算)のような形で説明されているのがよくわからないことになっていた原因でした。

 

これはもともとメソッド(関数)があって、そのメソッド内で処理されて返された値をDateTimeオブジェクトから参照するというような形だったので自分の認識は一応あってるはず。

 

オブジェクト指向型と手続き型で見比べてみると

 

オブジェクト指向
$date = new DateTime('2000-01-20');
$date->sub(new DateInterval('P10D'));
echo $date->format('Y-m-d') . "\n";

手続き型

$date = date_create('2000-01-20');
date_sub($date, date_interval_create_from_date_string('10 days'));
echo date_format($date, 'Y-m-d');

 

・手続き型に基づいて見比べる

$date → ここに与えられた値が新しいDateTimeオブジェクトと同義

date_interval_create_from_date_string

→ ここに与えられた値が新しいDateIntervalオブジェクトと同義

date_sub → $dateの値からdate_interval_create_from_date_stringに与えられた値を引く

date_add → date_subと同じ扱い方で値を加える。

ここで得られた値をDateTimeオブジェクトが参照する。

大体ふわっとした理解の上で書いているのできちんと理解を深めたい項目。

詳しいことはPHP: DateTime::sub - Manualを参照。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

☆ 指定された月を表示させる

F → (12月などの月をフルスペル(英語)で取得する。

受け取った引数(月と年)に対する処理の仕方

→月や年を-するのか+するのかを注意。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

☆ URLから値を取得する

値取得の際の例外処理(try catch)を忘れない。

preg_match → 正規表現によるマッチングを行う

この処理の際のパターンについて

\A → 先頭(行)と適合する → 「 ^ 」と同義

\Z → 末尾(最終行)と適合する → 「 $ 」と同義

「 ^ 」や「 $ 」を使うと不具合が起こりやすいので\A, \Zを必ず使う

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

☆ リンクをつくる

(式1) ? '式2' : ’式3’ → 三項演算子

式を左から順に評価していく

式1がtrue → 式2を値にする

式1がfalse → 式3を値にする

もしくは

(式1) ? '(式3)'というように真ん中を抜く形も可能

その場合は

式1がtrue → 式1を値にする

式1がfalse → 式3を値にする

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

オブジェクト指向で書き換える

名前空間を使う際の注意

PHPの標準クラス(ExceptionやDateTimeなど)は名前空間の一番上位から呼び出さなければならない。

名前空間の区切り文字( \ )をクラス名の前に入れる。

 

・ index.phpからCalendar.phpを呼び出すとき

requireを用いるのとCalendar.php内のCalendarクラスをインスタンス化するのを忘れない。

Calendarクラスをインスタンス化→$calなど適当な変数に代入

Calendarクラス内のprev変数を呼び出したい

 $cal → prevのようになる。

 

private, public, protectedなどのアクセス権についてきちんと理解する。

プロパティやメソッドの前に用いてアクセス権を指定する

private → 自身のクラス内でのみ呼び出しが可能

public → 外部のクラスやファイルからでも呼び出しが可能

protected → 自身のクラスと継承する子クラス(子クラスに変数を定義していたらその親クラス)から呼び出しが可能

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

まとめ

今回まとめていて、一番ふわっとした理解になっているところ(アロー演算子の部分)

オブジェクト指向を(用語を含めて)きちんと理解することと、その処理の中身を手続き型とオブジェクト指向型の両方で理解していくことが大切なのかもと思い、改めて道のりの長さを感じたところでした。