Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】DateTime::__construct()メソッドの使い方

__constructメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

DateTimeクラスの__constructメソッドは、新しいDateTimeオブジェクトを生成するメソッドです。このメソッドを使用することで、特定の日時を表すDateTimeオブジェクトをプログラム内で作成できます。引数には、日時文字列、タイムゾーンオブジェクト(DateTimeZone)、またはその両方を指定できます。日時文字列は、例えば "2023-10-27 10:00:00" のように、日付と時刻を表す文字列です。タイムゾーンオブジェクトを指定すると、そのDateTimeオブジェクトが特定のタイムゾーンに関連付けられます。タイムゾーンを指定しない場合は、PHPの設定で指定されたデフォルトのタイムゾーンが使用されます。

__constructメソッドは、引数の数や型に応じて複数の形式で呼び出すことができます。引数を省略した場合、現在の日時を表すDateTimeオブジェクトが作成されます。日時文字列のみを指定した場合、指定された日時を表すDateTimeオブジェクトが作成されます。日時文字列とタイムゾーンオブジェクトの両方を指定した場合、指定された日時を特定のタイムゾーンで表すDateTimeオブジェクトが作成されます。

DateTimeオブジェクトが正常に作成された場合、__constructメソッドは新しいDateTimeオブジェクトを返します。引数に無効な値を指定した場合、例外が発生することがあります。DateTimeオブジェクトは、日付や時刻の操作、フォーマット、比較など、さまざまな目的に使用できます。このメソッドは、PHPで日付と時刻を扱う上で基本的な役割を果たします。システムエンジニアとして、ユーザーからの入力に基づいて日時を処理したり、データベースに日時を保存したりする際に、このメソッドを適切に使用することで、正確な日時管理を行うことができます。

構文(syntax)

1public DateTime::__construct( string $datetime = "now", ?DateTimeZone $timezone = null )

引数(parameters)

string $datetime = 'now', ?DateTimeZone $timezone = null

  • string $datetime = 'now': 日時を指定する文字列。省略した場合は「now」(現在日時)が使用されます。
  • ?DateTimeZone $timezone = null: タイムゾーンを指定するDateTimeZoneオブジェクト。省略した場合は、PHPの設定またはデフォルトのタイムゾーンが使用されます。

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP 8 コンストラクタプロパティと DateTime を利用する

1<?php
2
3// DateTimeクラスの__constructメソッドとPHP 8のコンストラクタプロパティプロモーションを組み合わせた例。
4// コンストラクタプロパティプロモーションとは、コンストラクタの引数を直接クラスのプロパティとして宣言するPHP 8の機能です。
5
6class SimpleDate
7{
8    // PHP 8のコンストラクタプロパティプロモーションにより、
9    // $datetimeStringと$timezoneは自動的にこのクラスのprivateプロパティとして定義されます。
10    // その後、これらのプロパティはコンストラクタの内部でアクセス可能になります。
11    private DateTime $date;
12
13    /**
14     * 新しい日付オブジェクトを初期化します。
15     * 引数 ($datetimeString, $timezone) はプロパティとして昇格され、
16     * DateTime::__construct メソッドに渡されます。
17     *
18     * @param string             $datetimeString 日付と時刻を表す文字列 (例: 'now', '2023-10-27 10:30:00', 'tomorrow')。
19     *                                           DateTime::__construct の最初の引数として使用されます。
20     * @param ?DateTimeZone|null $timezone       オプションのタイムゾーンオブジェクト。nullの場合、PHPのデフォルトタイムゾーンが使用されます。
21     *                                           DateTime::__construct の二番目の引数として使用されます。
22     */
23    public function __construct(
24        private string $datetimeString = 'now',
25        private ?DateTimeZone $timezone = null
26    ) {
27        // ここで、昇格されたプロパティ ($this->datetimeString, $this->timezone) を使用して、
28        // DateTimeクラスのコンストラクタ (DateTime::__construct) を呼び出し、
29        // 新しいDateTimeオブジェクトを生成して、クラスの$dateプロパティに格納します。
30        $this->date = new DateTime($this->datetimeString, $this->timezone);
31    }
32
33    /**
34     * フォーマットされた日付と時刻を返します。
35     *
36     * @return string 'YYYY-MM-DD HH:MM:SS T' 形式の文字列。
37     */
38    public function getFormattedDate(): string
39    {
40        return $this->date->format('Y-m-d H:i:s T');
41    }
42
43    /**
44     * この日付オブジェクトが使用しているタイムゾーン名を返します。
45     *
46     * @return string タイムゾーン名。
47     */
48    public function getTimezoneName(): string
49    {
50        // 昇格された$timezoneプロパティに直接アクセスします。
51        // nullの場合に備え、nullsafe演算子 (?->) を使用しています。
52        return $this->timezone?->getName() ?? 'System Default (null provided)';
53    }
54}
55
56// --- 使用例 ---
57
58// 1. デフォルト引数を使用する例 ('now'とシステムデフォルトタイムゾーン)
59$defaultDate = new SimpleDate();
60echo "--- デフォルトの日付 ---\n";
61echo "日付と時刻: " . $defaultDate->getFormattedDate() . "\n";
62echo "タイムゾーン: " . $defaultDate->getTimezoneName() . "\n\n";
63
64// 2. 特定の日付文字列とタイムゾーンを指定する例
65$tokyoTimezone = new DateTimeZone('Asia/Tokyo');
66$specificDate = new SimpleDate('2023-10-27 10:30:00', $tokyoTimezone);
67echo "--- 特定の日付 (東京タイムゾーン) ---\n";
68echo "日付と時刻: " . $specificDate->getFormattedDate() . "\n";
69echo "タイムゾーン: " . $specificDate->getTimezoneName() . "\n\n";
70
71// 3. 日付文字列のみを指定し、タイムゾーンはデフォルトを使用する例
72$futureDate = new SimpleDate('+1 day'); // 明日の日付
73echo "--- 明日の日付 (システムデフォルトタイムゾーン) ---\n";
74echo "日付と時刻: " . $futureDate->getFormattedDate() . "\n";
75echo "タイムゾーン: " . $futureDate->getTimezoneName() . "\n";
76
77?>

PHPのDateTimeクラスの__constructメソッドは、日付と時刻を扱うオブジェクトを初期化するために使用されます。このメソッドは、第一引数に日付と時刻を表す文字列(例: 'now', '2023-10-27 10:30:00')、第二引数にオプションでタイムゾーンを指定するDateTimeZoneオブジェクトを受け取ります。引数を指定しない場合、デフォルトで現在の日時とPHPの設定に基づいたタイムゾーンが適用されます。コンストラクタであるため、直接の戻り値はありませんが、このメソッドが呼び出されることで初期化されたDateTimeインスタンスが生成されます。

PHP 8で導入された「コンストラクタプロパティプロモーション」は、コンストラクタの引数を、同時にそのクラスのプロパティとして宣言できる便利な機能です。これにより、プロパティの宣言とコンストラクタ内での代入処理をより簡潔に記述できるようになります。

提供されたサンプルコードでは、このDateTime::__constructメソッドとコンストラクタプロパティプロモーションを組み合わせています。SimpleDateクラスのコンストラクタで、引数$datetimeString$timezoneprivateプロパティとして宣言・昇格させています。これらの昇格されたプロパティは、コンストラクタの本体内でnew DateTime()の引数として利用され、内部の$dateプロパティにDateTimeオブジェクトを格納します。この設計により、クラスが受け取った日付文字列とタイムゾーンの情報を、外部からアクセスできない形で保持しつつ、内部でDateTimeオブジェクトとして処理できるようになります。

このサンプルコードはPHP 8以降の「コンストラクタプロパティプロモーション」機能を利用しており、それ以前のPHPバージョンでは動作しません。DateTimeクラスのコンストラクタの第一引数に無効な日付文字列を渡すと、エラーが発生する可能性があるため、入力値の有効性確認が重要です。タイムゾーン引数を省略またはnullにすると、PHPのデフォルト設定に従いシステムタイムゾーンが使用されます。プロパティプロモーションで定義するプロパティの可視性(例:private)は、外部からのアクセスを適切に制限するために設定します。getTimezoneNameメソッドでは、PHP 8のnullsafe演算子?->とnull合体演算子??を使い、nullの可能性がある場合に安全に処理しています。

MyCustomDateTimeで親コンストラクタを呼ぶ

1<?php
2
3// PHP 8 で導入された厳密な型チェックを有効にします。
4declare(strict_types=1);
5
6/**
7 * DateTime クラスを継承したカスタムの日付時刻クラス。
8 * このクラスは、親クラスである DateTime の機能を利用しつつ、
9 * 独自の拡張や振る舞いを加えることができます。
10 */
11class MyCustomDateTime extends DateTime
12{
13    /**
14     * MyCustomDateTime クラスのコンストラクタ。
15     * 新しい MyCustomDateTime オブジェクトを作成し、親クラスである DateTime の初期化を行います。
16     *
17     * @param string $datetime 日付と時刻を表す文字列。デフォルトは 'now'。
18     *                         DateTime::createFromFormat() で解析可能な形式である必要があります。
19     * @param ?DateTimeZone $timezone タイムゾーンオブジェクト。デフォルトは null で、
20     *                                 PHP の現在のデフォルトタイムゾーンが使用されます。
21     */
22    public function __construct(string $datetime = 'now', ?DateTimeZone $timezone = null)
23    {
24        // parent::__construct() を呼び出して、親クラス (DateTime) のコンストラクタを実行します。
25        // これにより、DateTime オブジェクトとしての基本的な日付時刻の解析と初期化が行われます。
26        // 継承されたクラスのコンストラクタでは、通常このように親のコンストラクタを呼び出すことで、
27        // 親クラスが持つべき初期状態を正しく設定します。
28        parent::__construct($datetime, $timezone);
29
30        // 必要に応じて、MyCustomDateTime クラス独自の追加の初期化処理をここに記述できます。
31        // 例: echo "MyCustomDateTime オブジェクトが作成されました: " . $this->format('Y-m-d H:i:s') . "\n";
32    }
33
34    /**
35     * このカスタム日付オブジェクトの現在の日時を、特定のフォーマットで取得します。
36     *
37     * @return string フォーマットされた日時文字列 (例: 2023-10-27 15:30:00 Asia/Tokyo)
38     */
39    public function getFormattedDateTimeWithTimezone(): string
40    {
41        return $this->format('Y-m-d H:i:s e'); // 'e' はタイムゾーン識別子を表示
42    }
43}
44
45// --- サンプルコードの実行例 ---
46
47try {
48    // 1. 引数なしで MyCustomDateTime オブジェクトを作成 (デフォルトで 'now' と現在のタイムゾーンを使用)
49    // 親の DateTime コンストラクタが内部で 'now' を処理し、現在の時刻で初期化します。
50    $currentDateTime = new MyCustomDateTime();
51    echo "現在のMyCustomDateTime: " . $currentDateTime->getFormattedDateTimeWithTimezone() . "\n";
52
53    // 2. 特定の日時文字列を指定して MyCustomDateTime オブジェクトを作成
54    // 親の DateTime コンストラクタが指定された文字列を解析して初期化します。
55    $specificDate = new MyCustomDateTime('2024-07-20 10:00:00');
56    echo "特定の日付のMyCustomDateTime: " . $specificDate->getFormattedDateTimeWithTimezone() . "\n";
57
58    // 3. 特定の日時とタイムゾーンを指定して MyCustomDateTime オブジェクトを作成
59    // DateTimeZone オブジェクトを作成し、親のコンストラクタに渡します。
60    $londonTimeZone = new DateTimeZone('Europe/London');
61    $londonDateTime = new MyCustomDateTime('2024-07-20 10:00:00', $londonTimeZone);
62    echo "ロンドン時刻のMyCustomDateTime: " . $londonDateTime->getFormattedDateTimeWithTimezone() . "\n";
63
64    // 4. 不正な日付文字列を渡した場合 (DateTime::__construct は例外をスローします)
65    // このようなケースでは、try-catch ブロックで例外を捕捉することが重要です。
66    // $invalidDateTime = new MyCustomDateTime('これは日付ではありません');
67    // echo "不正な日付: " . $invalidDateTime->getFormattedDateTimeWithTimezone() . "\n";
68
69} catch (Exception $e) {
70    // DateTime::__construct で発生した例外(例: 日付文字列の解析失敗)を捕捉します。
71    echo "エラーが発生しました: " . $e->getMessage() . "\n";
72}

このPHPコードは、PHPに標準で備わる日付時刻を扱うDateTimeクラスを継承し、MyCustomDateTimeという独自のクラスを定義する例を示しています。__constructは、このMyCustomDateTimeクラスの新しいオブジェクトを作成する際に自動的に実行される特別なメソッド、つまりコンストラクタです。このメソッドは、string $datetime?DateTimeZone $timezoneという二つの引数を持ちます。$datetimeは初期化する日付と時刻を表す文字列で、指定がなければ現在の時刻('now')が使われます。$timezoneはタイムゾーンを指定するオブジェクトで、指定がなければPHPのデフォルトタイムゾーンが適用されます。

コンストラクタ内部のparent::__construct($datetime, $timezone);は、親クラスであるDateTimeのコンストラクタを呼び出しています。これにより、MyCustomDateTimeオブジェクトが生成される際に、DateTimeオブジェクトとしての基本的な日付時刻の解析と初期化が確実に行われます。継承元のクラスが持つ初期化処理を正しく引き継ぐため、子クラスのコンストラクタではparent::__construct()を呼び出すのが一般的です。コンストラクタはオブジェクトの生成と初期化を行うため、特定の値を戻り値として返しません。

コードの実行例では、引数なしで現在の時刻のオブジェクトを作成したり、特定の日時やタイムゾーンを指定してオブジェクトを初期化する柔軟な使い方が示されています。また、日付文字列の形式が不正な場合には例外が発生するため、try-catch文を使ってエラーを適切に処理する重要性も合わせて学べます。

継承したクラスで独自のコンストラクタを定義する際は、親クラスの初期化を確実に行うため、parent::__construct()を必ず呼び出してください。これを省略すると、親クラスであるDateTimeの基本的な機能が正しく動作しない恐れがあります。また、DateTimeコンストラクタは、不正な日付文字列が渡された場合にExceptionをスローするため、利用時には必ずtry-catchブロックで例外を捕捉し、適切なエラー処理を行うことが重要です。引数の日付文字列は、PHPのstrtotime()関数で解析可能な形式で指定してください。タイムゾーンを明示的に指定することで、環境依存のデフォルト設定による予期せぬ動作を防ぐことができます。適切な初期化と堅牢なエラー処理で安全に利用しましょう。

PHP DateTime __constructで日時を生成する

1<?php
2
3/**
4 * DateTimeクラスのコンストラクタの基本的な使い方を示すサンプルコードです。
5 * __constructメソッドは、指定された日時を表す新しいDateTimeオブジェクトを作成します。
6 * 引数なし、日付文字列のみ、日付文字列とタイムゾーンの3つの一般的な使用例を示します。
7 * PHPのバージョン8を想定しています。
8 */
9
10// 1. 引数なしでDateTimeオブジェクトを作成する
11//    デフォルトでは、現在のローカル日時とPHPの設定されているタイムゾーンが使用されます。
12$now = new DateTime();
13echo "現在の時刻 (引数なし): " . $now->format('Y-m-d H:i:s') . " (タイムゾーン: " . $now->getTimezone()->getName() . ")\n";
14
15// 2. 日付と時刻の文字列を指定してDateTimeオブジェクトを作成する
16//    PHPが認識できる任意の文字列形式で指定できます。
17//    タイムゾーンが指定されない場合、PHPの設定されているタイムゾーンが使用されます。
18$specificDate = new DateTime('2023-01-15 10:30:00');
19echo "指定された時刻 (文字列のみ): " . $specificDate->format('Y-m-d H:i:s') . " (タイムゾーン: " . $specificDate->getTimezone()->getName() . ")\n";
20
21// 3. 日付と時刻の文字列、およびDateTimeZoneオブジェクトを指定してDateTimeオブジェクトを作成する
22//    特定のタイムゾーンで日時を表現したい場合に利用します。
23//    DateTimeZoneのコンストラクタは無効なタイムゾーン名が指定された場合にExceptionをスローするため、
24//    try-catchブロックで囲むのが安全です。
25try {
26    $timezone = new DateTimeZone('America/New_York'); // ニューヨークのタイムゾーンを作成
27    $nyTime = new DateTime('2023-01-15 10:30:00', $timezone);
28    echo "ニューヨークの指定時刻: " . $nyTime->format('Y-m-d H:i:s') . " (タイムゾーン: " . $nyTime->getTimezone()->getName() . ")\n";
29} catch (Exception $e) {
30    echo "エラーが発生しました: " . $e->getMessage() . "\n";
31}
32
33?>

PHPのDateTimeクラスの__constructメソッドは、指定された日時を表す新しいDateTimeオブジェクトを作成するための特別なメソッドです。これはクラスを初期化する「コンストラクタ」と呼ばれます。

第一引数$datetimeには、日付と時刻を表す文字列を指定します。この引数を省略すると、デフォルト値の'now'が使用され、オブジェクトは現在のローカル日時で初期化されます。

第二引数$timezoneはオプションで、DateTimeZoneオブジェクトを指定することで、特定の日時をどのタイムゾーンで解釈するかを明確にできます。この引数を省略した場合、PHPの設定で定められたデフォルトのタイムゾーンが使用されます。

このコンストラクタは、指定された情報に基づいてDateTimeオブジェクトを生成し、戻り値として直接値を返すわけではありません。

サンプルコードでは、まず引数なしで現在のローカル日時を持つオブジェクトを作成しています。次に、日付と時刻の文字列のみを指定し、PHP設定のタイムゾーンで解釈されるオブジェクトの例を示します。最後に、日付と時刻の文字列に加えてAmerica/New_Yorkといった特定のDateTimeZoneオブジェクトを渡すことで、指定されたタイムゾーンで日時を表現するオブジェクトを作成する方法を紹介しています。DateTimeZoneオブジェクトの作成時に無効なタイムゾーン名を使用するとエラーになるため、try-catchブロックで囲むのが安全です。

DateTimeオブジェクト生成時、引数なしや文字列のみではPHP設定のタイムゾーンが適用されます。意図しない日時処理を防ぐため、DateTimeZoneを明示的に指定しましょう。日時文字列は曖昧な解釈を防ぐため、'Y-m-d H:i:s'のような明確な形式で指定すると安全です。DateTimeZoneコンストラクタは無効なタイムゾーン名で例外をスローするため、実運用ではtry-catchでエラー処理をしてください。

PHP DateTime コンストラクタで日時を構築する

1<?php
2
3/**
4 * DateTimeクラスのコンストラクタ(__construct)の使用方法を示すサンプルコードです。
5 *
6 * DateTimeオブジェクトは、日付と時刻の情報を扱うためのPHPの組み込みクラスです。
7 * コンストラクタを使って、様々な方法でDateTimeオブジェクトを初期化(構築)できます。
8 */
9function demonstrateDateTimeConstructor(): void
10{
11    echo "--- DateTime::__construct() の使用例 ---\n\n";
12
13    // 1. 引数なしでDateTimeオブジェクトを構築する
14    // デフォルトでは、'now' が引数として扱われ、現在のシステム時刻とタイムゾーンでオブジェクトが作成されます。
15    $currentDateTime = new DateTime();
16    echo "1. 現在の時刻で構築: " . $currentDateTime->format('Y-m-d H:i:s P') . "\n"; // Pはタイムゾーンオフセットを表示
17
18    // 2. 特定の日付文字列を指定してDateTimeオブジェクトを構築する
19    // 日付文字列は、PHPが解析できる様々な形式で指定できます。
20    $specificDateTime = new DateTime('2023-01-15 14:30:00');
21    echo "2. 指定した日付文字列で構築: " . $specificDateTime->format('Y-m-d H:i:s P') . "\n";
22
23    // 3. 特定の日付文字列とタイムゾーンを指定してDateTimeオブジェクトを構築する
24    // DateTimeZoneオブジェクトを事前に作成し、コンストラクタの第2引数として渡します。
25    $timezone = new DateTimeZone('America/New_York');
26    $dateTimeWithTimezone = new DateTime('2023-01-15 14:30:00', $timezone);
27    echo "3. 特定のタイムゾーンで構築 (NY): " . $dateTimeWithTimezone->format('Y-m-d H:i:s P') . "\n";
28
29    // 4. 未来または過去の日付文字列で構築することも可能です
30    $futureDateTime = new DateTime('+1 day'); // 今から1日後の日時
31    echo "4. 相対的な日付で構築 (+1 day): " . $futureDateTime->format('Y-m-d H:i:s P') . "\n";
32
33    $pastDateTime = new DateTime('yesterday'); // 昨日の日時
34    echo "5. 相対的な日付で構築 (yesterday): " . $pastDateTime->format('Y-m-d H:i:s P') . "\n";
35
36    echo "\n----------------------------------------\n";
37}
38
39// 上記の関数を実行して、DateTimeオブジェクトの構築例を確認します。
40demonstrateDateTimeConstructor();
41

PHPのDateTimeクラスは、日付や時刻の情報を扱うための組み込みクラスです。そのオブジェクトを作成し、初期化する際に使われる特別なメソッドが__construct、通称「コンストラクタ」です。

このコンストラクタは、主に二つの引数を受け取ります。最初の引数$datetimeは、初期化したい日付や時刻を文字列で指定します。この引数を省略した場合、デフォルト値の'now'が適用され、現在のシステム時刻でオブジェクトが構築されます。具体的に'2023-01-15 14:30:00'のような日時を指定したり、'+1 day''yesterday'といった相対的な日時を指定することも可能です。

二つ目の引数$timezoneは、タイムゾーンを指定するDateTimeZoneオブジェクトです。この引数を省略すると、PHPのシステム設定に基づくデフォルトのタイムゾーンが使用されます。特定のタイムゾーンで日時を扱いたい場合は、new DateTimeZone('America/New_York')のように事前に作成したタイムゾーンオブジェクトを渡します。

__constructは新しいDateTimeオブジェクトを構築する役割を持つため、メソッド自体から明示的な戻り値はありません。new DateTime(...)という形でコンストラクタを実行することで、初期化されたDateTimeオブジェクトが直接得られます。このように、__constructを使うことで目的に応じた日付・時刻オブジェクトを柔軟に作成できます。

DateTime::__construct()は、日付と時刻の情報を扱うオブジェクトを初期化する際に使用します。引数を省略した場合、現在のシステム時刻とPHPのデフォルトタイムゾーン(またはシステムのタイムゾーン)でオブジェクトが作成されます。日付文字列を指定する際は、PHPが正しく解釈できる形式を用いることが重要です。不適切な文字列はエラーの原因となることがありますのでご注意ください。タイムゾーンを明示的に指定する場合は、必ずDateTimeZoneクラスのオブジェクトとして渡す必要があります。指定しないと、デフォルトのタイムゾーンが適用されるため、意図しない時刻のずれが生じることがあります。これらの点を理解し、目的のタイムゾーンと正確な時刻でオブジェクトを構築するようにしてください。

関連コンテンツ

関連IT用語

関連プログラミング言語