モバイルをチェックするコードを扱う
PHPで現在接続しているデバイスがモバイル(スマートフォン、タブレットなど)で実行されているかどうかをチェックするコードについて扱います。
モバイルをチェックするコードは関数として扱います。この関数はモバイルをチェックする関数として、モバイルデバイスを識別するために使用できます。これは、モバイル環境で特定の機能を提供したり、モバイルおよびデスクトップのユーザーに異なるエクスペリエンスを提供したりするウェブサイトで有用です。
参考してください!
ここで扱うモバイルをチェックする方法は、正確性や拡張性の面で制限がある場合があるため、正確性や拡張性を保証するものではありません。したがって、すべての資料や例を信頼する前に、自身の判断に基づき、エラー、バグ、脆弱性がないか慎重にテストし、検討する必要があります。
モバイルをチェックする関数
コードを作成する際、ウェブアプリケーションのユーザー環境を考慮することは非常に重要です。特にモバイルデバイスでの使用を考慮する場合は、それに対するチェックが必要です。そのために、PHPを使用してモバイルデバイスを検知する関数を作成してみます。
まず、PHPではユーザーのウェブブラウザから送信されるHTTP_USER_AGENTヘッダーを通じて、ユーザーエージェント情報を確認できます。この情報を基に、モバイルデバイスであるかどうかを判断できます。また、PHP 8からはstr_contains()関数が導入され、特定の文字列が含まれているかどうかを簡単に確認できるようになりました。しかし、PHP 8未満の環境ではこの関数を使用できないため、これを代替するためのポリフィル(polyfill)関数も併せて提供します。
モバイルをチェックする関数のコード
/**
* PHP 8で導入されたstr_contains()関数をポリフィルで代替する関数です。
* PHP 8未満のバージョンでstr_contains()関数を使用するために使用されます。
*
* @param string $haystack 対象の文字列です。
* @param string $needle 検索する部分文字列です。
* @return bool 指定された文字列に部分文字列が含まれていればtrueを、そうでなければfalseを返します。
*/
if (!function_exists('str_contains')) {
/*
* str_contains()関수의ポリフィル
* 出典: https://core.trac.wordpress.org/browser/trunk/src/wp-includes/compat.php#L423
*/
function str_contains($haystack, $needle) {
if ('' === $needle) {
return true;
}
return false !== strpos($haystack, $needle);
}
}
/**
* モバイルデバイスを検知してチェックする関数です。
* HTTP_SEC_CH_UA_MOBILEヘッダーを確認し、HTTP_USER_AGENTを分析してモバイルデバイスかどうかを判断します。
*
* @return bool モバイルデバイスが検知されればtrueを、そうでなければfalseを返します。
*/
function is_mobile() {
if (isset($_SERVER['HTTP_SEC_CH_UA_MOBILE'])) {
// HTTP_SEC_CH_UA_MOBILEヘッダーが存在し、値が'?1'の場合、モバイルと判断します。
// 参照: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Sec-CH-UA-Mobile
return ( '?1' === $_SERVER['HTTP_SEC_CH_UA_MOBILE'] );
} elseif (!empty($_SERVER['HTTP_USER_AGENT'])) {
// HTTP_USER_AGENTを分析してモバイルの特徴を探します。
$user_agent = $_SERVER['HTTP_USER_AGENT'];
return str_contains($user_agent, 'Mobile')
|| str_contains($user_agent, 'Android')
|| str_contains($user_agent, 'Silk/')
|| str_contains($user_agent, 'Kindle')
|| str_contains($user_agent, 'BlackBerry')
|| str_contains($user_agent, 'Opera Mini')
|| str_contains($user_agent, 'Opera Mobi');
} else {
// HTTP_SEC_CH_UA_MOBILEヘッダーもなく、HTTP_USER_AGENTもなければモバイルではないとみなします。
return false;
}
}
/* モバイルかどうかによって異なるコードを実行します。 */
if(is_mobile()) {
// モバイル環境で使用するコード
} else {
// デスクトップ環境で使用するコード
}
上記のコードは、PHPでモバイルを検知してチェックする簡単な関数を提供します。ただし、上記のサンプルコードの制限事項も必ず確認してください。
上記サンプルコードの制限事項
上記サンプルコードにはいくつかの制限事項があります。これには以下の事項が含まれます。
HTTP_USER_AGENTの制限事項
ユーザーエージェント文字列を分析してモバイルデバイスを検知する方法は、信頼性が低い場合があります。ユーザーエージェントは、ユーザー自身がスマートフォンのブラウザからデスクトップモードに変更することも可能です。したがって、このコードはユーザーエージェントに起因する制限事項を抱えています。また、クライアント側の情報をセキュリティ関連の目的で利用する場合は、別途適切な措置を講じる必要があります。
新しいモバイルデバイス追加への拡張性
このコードは、モバイルデバイスを検知するために HTTP_USER_AGENT ヘッダーを分析します。新しいモバイルデバイスが発売されるたびに、そのデバイスのユーザーエージェント文字列のパターンを考慮してコードを更新する必要があります。そのため、新しいモバイルデバイスが追加されるたびにメンテナンスが必要になる可能性があります。
キャッシュされたユーザーエージェント値の不一致
キャッシュが適用されている場合、同じユーザーエージェント値を持つ複数のユーザーが異なるデバイスからアクセスした際に問題が発生する可能性があります。キャッシュされたユーザーエージェント値が固定されていると、新しいデバイスやブラウザからアクセスしたときに正しい結果を返せないことがあります。これはユーザーエクスペリエンスを低下させ、誤った結果を提供する原因となります。
したがって、キャッシュを実装する際は、ユーザーエージェント値がキャッシュされないように注意する必要があります。代わりに、ユーザーを識別できる安定した方法を用いてキャッシュを構成する必要があります。