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

【PHP8.x】DateTimeInterface::COOKIE定数の使い方

COOKIE定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

COOKIE定数は、PHPのDateTimeInterfaceインターフェースに定義されている、日付と時刻の特定の書式を表す定数です。この定数は、主にWebアプリケーションで利用されるHTTPクッキーの有効期限を記述する際に、標準的なフォーマットを提供するために用いられます。

具体的には、日付と時刻を扱うDateTimeDateTimeImmutableといったクラスのインスタンスが持つformat()メソッドにこのCOOKIE定数を引数として渡すことで、HTTPクッキーの仕様に準拠した日付時刻文字列を生成できます。このフォーマットは「曜日, 日-月-年 時:分:秒 タイムゾーン」といった形式であり、Webサーバーとブラウザ間でクッキーの有効期限が正確に解釈されることを保証します。

システムエンジニアリングにおいて、Webサイトのセッション管理やユーザー設定の保存などでクッキーを利用する際、このCOOKIE定数を使用することで、国際標準に則った信頼性の高い日付時刻フォーマットを簡単に適用できます。これにより、異なるシステム間での互換性を保ちつつ、開発効率を向上させることが可能です。

構文(syntax)

1<?php
2echo DateTimeInterface::COOKIE;
3?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

string

COOKIE 定数は、DateTimeInterface インターフェースを実装したオブジェクトが、HTTP Cookie としてフォーマットされた日付と時刻を表す文字列を返します。この文字列は、Set-Cookie ヘッダーで直接使用できる形式です。

サンプルコード

PHPでクッキーを削除する

1<?php
2
3/**
4 * 指定された名前のクッキーを削除します。
5 * クッキーを削除するには、有効期限を過去のUNIXタイムスタンプに設定し、値を空にします。
6 * path、domain、secure、httponlyなどの属性は、元のクッキーが設定された際と同じに設定する必要があります。
7 *
8 * @param string $name クッキーの名前
9 * @param string $path クッキーのパス (デフォルトは '/')
10 * @param string|null $domain クッキーのドメイン (nullの場合は現在のドメイン)
11 * @param bool $secure HTTPS接続でのみ送信するか (デフォルトは false)
12 * @param bool $httponly JavaScriptからアクセスできないようにするか (デフォルトは false)
13 * @return bool クッキーの削除コマンドが成功したかどうか
14 */
15function deleteCookie(string $name, string $path = '/', ?string $domain = null, bool $secure = false, bool $httponly = false): bool
16{
17    // クッキーを削除するためのオプションを設定
18    // expires: クッキーの有効期限を過去のUNIXタイムスタンプに設定することで、ブラウザに削除を指示します。
19    // 値は空文字列に設定します。
20    $options = [
21        'expires' => time() - 3600, // 現在時刻より1時間過去のUNIXタイムスタンプを設定
22        'path' => $path,            // 削除したいクッキーのパスと一致させる
23        'domain' => $domain,        // 削除したいクッキーのドメインと一致させる
24        'secure' => $secure,        // 削除したいクッキーのsecure属性と一致させる
25        'httponly' => $httponly,    // 削除したいクッキーのhttponly属性と一致させる
26        'samesite' => 'Lax'         // クロスサイトリクエストフォージェリ (CSRF) 攻撃対策として推奨
27    ];
28
29    // setcookie関数でクッキーを削除するコマンドを送信
30    $isDeleted = setcookie($name, '', $options);
31
32    // DateTimeInterface::COOKIE 定数の利用例
33    // この定数は、HTTPヘッダーなどで使われるクッキーの有効期限の日付フォーマットを示す文字列です。
34    // setcookie関数の 'expires' 引数にはUNIXタイムスタンプを使用しますが、
35    // 実際にHTTPヘッダーで送信される際は、この定数が示すフォーマットに似た形式の文字列に変換されます。
36    $currentDateTime = new DateTime();
37    $cookieDateFormatExample = $currentDateTime->format(DateTimeInterface::COOKIE);
38
39    if ($isDeleted) {
40        // クッキー削除コマンドが成功した場合のログ出力
41        error_log(
42            "INFO: Cookie '{$name}' deletion command sent successfully. " .
43            "Example of COOKIE date format: '{$cookieDateFormatExample}'"
44        );
45    } else {
46        // クッキー削除コマンドが失敗した場合のログ出力
47        error_log("ERROR: Failed to send deletion command for cookie '{$name}'.");
48    }
49
50    return $isDeleted;
51}
52
53// --- サンプルコードの実行 ---
54// この部分は、このPHPスクリプトをWebサーバー経由で実行した際に動作します。
55
56// 削除したいクッキーの名前を指定
57$cookieNameToDelete = 'my_user_session';
58
59// クッキー削除関数を呼び出す
60if (deleteCookie($cookieNameToDelete)) {
61    // ブラウザへのメッセージ出力(開発者ツールでクッキーが削除されたか確認してください)
62    echo "Successfully attempted to delete cookie '{$cookieNameToDelete}'. " .
63         "Please check your browser's developer tools for confirmation.\n";
64} else {
65    // ブラウザへのメッセージ出力(削除失敗の場合)
66    echo "Failed to attempt deletion of cookie '{$cookieNameToDelete}'. " .
67         "Check server error logs for details.\n";
68}
69
70// 必要に応じて、パスやドメインが異なるクッキーの削除も同様に行えます。
71// 例: /admin パスに設定された HTTPS 専用クッキーを削除する場合
72/*
73$adminCookieName = 'admin_auth_token';
74$adminCookiePath = '/admin/';
75$adminCookieDomain = 'example.com'; // 実際のドメインに置き換える
76$adminCookieSecure = true;
77
78if (deleteCookie($adminCookieName, $adminCookiePath, $adminCookieDomain, $adminCookieSecure, true)) {
79    echo "\nSuccessfully attempted to delete cookie '{$adminCookieName}'.\n";
80} else {
81    echo "\nFailed to attempt deletion of cookie '{$adminCookieName}'.\n";
82}
83*/
84
85?>

このPHPサンプルコードは、Webブラウザに保存されている特定のクッキーを削除するためのdeleteCookie関数を提供します。クッキーを削除する基本的な方法は、setcookie関数を使って、そのクッキーの有効期限(expires)を過去のUNIXタイムスタンプに設定し、値を空にすることです。さらに、元のクッキーが設定された際に使用されたパス($path)、ドメイン($domain)、およびsecure(HTTPS接続のみ)、httponly(JavaScriptからのアクセス制限)といった属性と完全に一致させる必要があります。

deleteCookie関数は、削除したいクッキーの名前を$nameとして受け取り、その他の属性情報も引数として指定できます。これらの情報をもとにsetcookie関数を呼び出し、クッキー削除の指示をブラウザに送信します。関数の戻り値は、クッキー削除のコマンドが正常にブラウザへ送信されたかどうかを真偽値で返します。

コード内で使われているDateTimeInterface::COOKIE定数は、PHPのDateTimeクラスで日付をフォーマットする際に使用できる、HTTPヘッダーでクッキーの有効期限を示す標準的な日付フォーマットの文字列です。この定数自体が直接クッキー削除のロジックに関わるわけではありませんが、setcookie関数のexpires引数にはUNIXタイムスタンプを指定するものの、実際にブラウザへ送信されるHTTPヘッダーでは、この定数が示す形式に似た文字列で有効期限が表現されることの参考例として示されています。システムエンジニアにとって、クッキーを正確に管理することは、ウェブアプリケーションのセキュリティと機能性を保つ上で非常に重要です。

クッキーを削除する際は、setcookie 関数の namepathdomainsecurehttponly などの属性を、対象のクッキーと完全に一致させる必要があります。一つでも異なるとブラウザは削除と認識しませんのでご注意ください。有効期限を過去のUNIXタイムスタンプに、値を空に設定することで削除を指示します。

DateTimeInterface::COOKIE 定数は、HTTPヘッダーで使われるクッキーの有効期限の日付フォーマットの例を示すものであり、setcookie 関数の expires 引数にはUNIXタイムスタンプを渡します。この定数自体を直接 expires に指定するわけではありません。

また、setcookie 関数はHTTPヘッダーを送信するため、スクリプトで何らかの出力が行われる前に呼び出すようにしてください。samesite 属性の設定は、クロスサイトリクエストフォージェリ (CSRF) 対策としてセキュリティ向上に貢献しますので、積極的に利用をご検討ください。

PHP Cookieフォーマットで日時を取得する

1<?php
2
3/**
4 * 現在の日時をHTTP CookieのExpires属性などで利用されるフォーマットで取得します。
5 *
6 * DateTimeInterface::COOKIE 定数は、HTTPヘッダのSet-Cookieで有効期限(Expires属性)を
7 * 指定する際に用いられる特定のフォーマット文字列(例: "Wed, 23-Nov-2024 10:30:00 GMT")を提供します。
8 * このサンプルコードは、キーワード「php cookie 取得」が指す$_COOKIEグローバル変数による
9 * Cookieの値の取得ではなく、Cookieの期限設定に関連する日付フォーマットの利用を示しています。
10 */
11
12// 現在の日時を取得するDateTimeオブジェクトを生成します。
13$now = new DateTime();
14
15// DateTimeInterface::COOKIE 定数を使用して、現在の日時をCookieのExpires属性に適した形式でフォーマットします。
16$formattedDateForCookie = $now->format(DateTimeInterface::COOKIE);
17
18// フォーマットされた日時文字列を出力します。
19// この文字列は、例えばsetcookie()関数のexpires引数に渡されるタイムスタンプが変換される形式、
20// あるいはHTTPヘッダを直接操作する際に使用できます。
21echo $formattedDateForCookie . "\n";
22
23?>

このPHPのサンプルコードは、HTTP Cookieの有効期限を設定する際に必要となる、特定の日時フォーマット文字列を生成する方法を示しています。一般的に「php cookie 取得」というキーワードは、$_COOKIEグローバル変数を使ってブラウザから送られてきたCookieの値を読み取ることを指しますが、このコードはそれとは異なり、サーバー側でCookieを発行する際にその期限を指定するための日付フォーマットを利用するものです。

DateTimeInterface::COOKIEは、PHP 8で利用できるDateTimeInterfaceクラスに定義された定数の一つで、引数は持ちません。この定数は、HTTPヘッダのSet-Cookieで有効期限(Expires属性)を指定する際に標準として用いられる、特定のフォーマット文字列(例: "Wed, 23-Nov-2024 10:30:00 GMT")を定義しています。

サンプルコードでは、まずnew DateTime()で現在の日時を表すオブジェクトを生成しています。次に、このオブジェクトのformat()メソッドにDateTimeInterface::COOKIE定数を渡すことで、現在の日時をCookieの有効期限に適した書式で整形しています。このformat()メソッドの戻り値は文字列型であり、HTTP標準に準拠した日時文字列が得られます。生成された文字列は、setcookie()関数のexpires引数に渡す日付の表現や、HTTPレスポンスヘッダを直接操作する際などに利用されます。この定数を使うことで、開発者は複雑な日付フォーマットルールを意識することなく、簡単にCookie期限を設定できるようになります。

このサンプルコードは、「php cookie 取得」というキーワードから想像される、既に設定されたCookieの情報を読み取る目的とは異なります。DateTimeInterface::COOKIE定数は、HTTP Cookieの有効期限(Expires属性)を設定する際に使う特定の日付フォーマット文字列を提供します。これは、新しいCookieを設定する際に、正しい形式で期限を指定するための書式です。実際にCookieをブラウザへ送るには、setcookie()関数などの利用が必要です。この定数を使うことで、HTTPの仕様に準拠した正確な日付形式を簡単に得られるため、手動でフォーマットする際の間違いを防げます。既存のCookieの値を取得するには$_COOKIEグローバル変数を利用しますので、混同しないようご注意ください。

関連コンテンツ