date関数からDateTimeクラスに置き換えると日時取得が簡素になるか、複雑になるか。
カレンダー自体のプログラムは『PHP:phpで簡単なカレンダーを作成する方法』のサンプルを使用させていただきました。
月末が何日かを取得
まず年月と、月末日の取得。
// 現在日時のインスタンス生成 $now = new DateTime(); // 現在の年月を取得 $year = $now->format('Y'); $month = $now->format('n'); // 月末日を取得 $last_day = $now->format('t');
年月それぞれだけの変数を作ることに関しては、インスタンス生成の必要性の分だけでなく、dateのほうが短いです。
月末日の取得は、フォーマット時にtで「その月の日数=最終日」をそのまま取得できるので、計算して取得する手法より大幅に見やすくなります。
曜日を取得
// ループの前に当該年月1日のDateTimeインスタンスを生成 $temp_date = new DateTime("{$year}-{$month}-1"); // 月末日までループ for ($i = 1; $i < $last_day + 1; $i++) { // 曜日を取得 $week = $temp_date->format('w'); $temp_date->modify("+1 day");//ループの次の周のために1日次へ。 //以下略
ループ内で1日ずつ足し「w」で曜日を数値として取得するだけと、理解しやすく書けます。
まとめ
単純に「今日」や固定の日時を扱うならdate関数でシンプルに書けますが、実行月の最終日のような変化する要素に加工した結果や曜日を取り出すのはDateTimeクラスのほうがシンプルで、見た目に理解しやすいようです。
初心者に教えるときは、例えばメールフォームの送信日時のような加工しない段階ではdate関数を、加工して扱わないといけない段階ではオブジェクトについての話と共にDateTimeクラスを教えるような流れが良さそうです。
参考サイト
- PHP:phpで簡単なカレンダーを作成する方法
- PHPマニュアル:DateTime クラス
- PHPマニュアル:DateTime::format
- PHPマニュアル:date