【PHP8.x】endプロパティの使い方
endプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
endプロパティは、DatePeriodオブジェクトが表す期間の終了日時を保持するプロパティです。このプロパティは、DateTimeImmutableオブジェクトとして値を持ちます。DatePeriodは、開始日時、終了日時、および期間を指定することで、連続したDateTimeImmutableオブジェクトのシーケンスを生成します。endプロパティは、このシーケンスが終了する日時を格納し、期間全体の終端を定義します。
DatePeriodオブジェクトが生成された後、endプロパティに直接新しいDateTimeImmutableオブジェクトを割り当てることはできません。DatePeriodオブジェクトの終了日時を変更したい場合は、新しいDatePeriodオブジェクトを生成する必要があります。
endプロパティは、DatePeriodオブジェクトの反復処理が完了した後に、期間の終了日時を確認するために使用できます。また、DatePeriodオブジェクトが表す期間の長さや、期間内の特定の日時が含まれているかどうかなどの検証にも役立ちます。
例えば、特定の期間におけるイベントのスケジュールを扱う場合、DatePeriodを使用して期間全体を反復処理し、endプロパティを使用して最終イベントの開催日時を確認することができます。このように、endプロパティは、DatePeriodオブジェクトが表す期間の終了時点を正確に把握し、日付と時刻に関連する様々な処理を効率的に行うために不可欠な役割を果たします。
構文(syntax)
1public readonly DateTimeInterface $end
引数(parameters)
引数なし
引数はありません
戻り値(return)
DateTimeInterface|null
DatePeriodオブジェクトの終了日時を表すDateTimeInterfaceオブジェクト、または期間が終了しない場合はnullを返します。
サンプルコード
PHP DatePeriodのendプロパティとforeach
1<?php 2 3// DatePeriod オブジェクトを作成 4$start = new DateTime('2024-01-01'); 5$end = new DateTime('2024-01-05'); 6$interval = new DateInterval('P1D'); // 1日ごと 7$period = new DatePeriod($start, $interval, $end); 8 9// DatePeriod の end プロパティにアクセス 10$endDateTime = $period->end; 11 12// 結果を出力 13if ($endDateTime !== null) { 14 echo "DatePeriod の end プロパティ: " . $endDateTime->format('Y-m-d H:i:s') . PHP_EOL; 15} else { 16 echo "DatePeriod の end プロパティは null です。" . PHP_EOL; 17} 18 19// foreach で DatePeriod を反復処理し、end プロパティがどのように変化するかを確認 20$dates = []; 21foreach ($period as $date) { 22 $dates[] = $date->format('Y-m-d'); 23} 24 25// foreach 終了後にもう一度 end プロパティにアクセス 26$endDateTimeAfterLoop = $period->end; 27 28if ($endDateTimeAfterLoop !== null) { 29 echo "foreach ループ後の DatePeriod の end プロパティ: " . $endDateTimeAfterLoop->format('Y-m-d H:i:s') . PHP_EOL; 30} else { 31 echo "foreach ループ後の DatePeriod の end プロパティは null です。" . PHP_EOL; 32} 33?>
このサンプルコードは、PHP 8のDatePeriodクラスにおけるendプロパティの使い方を示しています。DatePeriodは、特定の日付間隔で繰り返される日付のシーケンスを表現するクラスです。endプロパティは、DatePeriodオブジェクトが表す期間の終了日時をDateTimeInterface型またはnull型で返します。
サンプルコードでは、まずDatePeriodオブジェクトを作成し、そのendプロパティにアクセスして、終了日時を取得しています。取得した終了日時はDateTimeInterfaceオブジェクトなので、format()メソッドを使って指定した形式で文字列に変換し、画面に出力しています。
重要な点として、DatePeriodオブジェクトをforeachループで反復処理すると、endプロパティの値がループの進行に合わせて変化します。具体的には、ループが終了した後、endプロパティはDatePeriodが表す期間の最終日時に更新されます。サンプルコードでは、foreachループの前後でendプロパティの値を確認し、その変化を観察しています。この挙動を理解することで、DatePeriodオブジェクトをより効果的に活用できます。もし、指定された終了日時がない場合、endプロパティはnullを返します。この点も考慮して、コードを記述する必要があります。
DatePeriod クラスの end プロパティは、期間の終了日時を表します。初期状態では、DatePeriod オブジェクト作成時に指定した終了日時が格納されています。
foreach ループで DatePeriod オブジェクトを反復処理する際、end プロパティの値がループ処理によって自動的に更新されることはありません。end プロパティの値は、DatePeriod オブジェクトの作成時に設定された終了日時を保持し続けます。そのため、ループの前後で end プロパティの値は変化しません。
end プロパティが null になるケースは、DatePeriod オブジェクトの作成方法や、PHP のバージョンによって異なります。もし end プロパティが null の場合、日付のフォーマット処理を行う前に null チェックを行う必要があります。サンプルコードでは、if ($endDateTime !== null) で null チェックを行っています。
PHP DatePeriodの終了日をif-endifで確認する
1<?php 2 3/** 4 * DatePeriodオブジェクトの終了日を確認し、表示する関数。 5 * 6 * この関数は、DatePeriodオブジェクトを受け取り、そのendプロパティをチェックします。 7 * 終了日が設定されているかどうかを判定するために、PHPの代替構文である 8 * `if (...):` と `endif;` を使用しています。 9 * 10 * @param DatePeriod $period 期間を表すDatePeriodオブジェクト。 11 * @return void 12 */ 13function checkAndDisplayEndDate(DatePeriod $period): void 14{ 15 // DatePeriodオブジェクトのendプロパティから終了日を取得します。 16 // 終了日が設定されていない場合、このプロパティはnullを返します。 17 $endDate = $period->end; 18 19 // 終了日が設定されているか(nullでないか)をチェックします。 20 // ここでは、HTMLテンプレート内などで可読性を高めるために使われる 21 // 代替構文 if-endif を使用しています。 22 if ($endDate !== null) : 23 // 終了日が設定されている場合、年月日をフォーマットして表示します。 24 echo '期間の終了日: ' . $endDate->format('Y-m-d') . PHP_EOL; 25 else : 26 // 終了日が設定されていない場合(繰り返し回数で指定された場合など)、 27 // その旨をメッセージで表示します。 28 echo 'この期間には明確な終了日は設定されていません。' . PHP_EOL; 29 endif; 30} 31 32// --- ケース1: 終了日を指定してDatePeriodを作成 --- 33 34// 開始日、間隔、終了日を定義します。 35$start = new DateTime('2023-04-01'); 36$interval = new DateInterval('P1M'); // P1Mは1ヶ月の間隔 37$end = new DateTime('2023-07-01'); 38 39// DatePeriodオブジェクトを作成します。 40$periodWithEndDate = new DatePeriod($start, $interval, $end); 41 42echo "--- 終了日が設定されている場合の実行例 ---" . PHP_EOL; 43checkAndDisplayEndDate($periodWithEndDate); 44 45 46// --- ケース2: 繰り返し回数を指定してDatePeriodを作成 --- 47 48// 開始日、間隔、繰り返し回数を定義します。 49// この方法では、明示的な終了日が設定されないため、endプロパティはnullになります。 50$startRecurrences = new DateTime('2024-01-01'); 51$intervalRecurrences = new DateInterval('P1W'); // P1Wは1週間の間隔 52$recurrences = 4; // 4回繰り返す 53 54// DatePeriodオブジェクトを作成します。 55$periodWithRecurrences = new DatePeriod($startRecurrences, $intervalRecurrences, $recurrences); 56 57echo PHP_EOL; 58echo "--- 終了日が設定されていない場合の実行例 ---" . PHP_EOL; 59checkAndDisplayEndDate($periodWithRecurrences); 60 61?>
このPHPサンプルコードは、DatePeriodオブジェクトに設定された期間の終了日を安全に確認し、表示する方法を示しています。DatePeriodクラスのendプロパティは、期間の終了日を示すDateTimeInterfaceオブジェクトを返しますが、繰り返し回数で期間が定義されている場合など、明示的な終了日が設定されていない場合はnullを返します。
コードでは、checkAndDisplayEndDate関数内でこのendプロパティの値がnullではないかをチェックしています。ここで注目すべきは、条件分岐にPHPの代替構文であるif (...):とendif;が使用されている点です。これは通常のif (...) { ... }と同じ機能を持ち、特にHTMLテンプレート内などでPHPコードとHTMLを区別しやすくするために使われます。
サンプルコードは二つのケースで動作を確認します。一つは開始日、間隔、終了日を明確に指定してDatePeriodを作成した場合で、このときendプロパティは終了日を返します。もう一つは開始日、間隔、繰り返し回数を指定してDatePeriodを作成した場合で、このときはendプロパティがnullを返すため、その旨のメッセージが表示されます。これにより、endプロパティの戻り値がnullである可能性を考慮したコードの書き方を学ぶことができます。
DatePeriodのendプロパティは、期間の終了日を表しますが、終了日が設定されていない場合はnullを返す点に注意が必要です。繰り返し回数で期間を指定した場合、endプロパティはnullになります。
サンプルコードでは、if-endif構文を使ってnullチェックを行っていますが、これはif ($endDate !== null)と同じ意味です。HTMLテンプレートなどで可読性を高めるために使われることがあります。
DateTimeInterface型として返される終了日は、format()メソッドで任意の形式に整形できます。DatePeriodオブジェクト作成時に終了日を指定する方法と、繰り返し回数を指定する方法があり、それぞれでendプロパティの値が異なることを理解しておきましょう。