PHP7初級試験 模擬問題 – 出題範囲: 日付と時刻、国際化とローカライゼーション、コマンドライン からの出題となります。
受験を考えているあなたも、試験を合格したあなたも、ぜひチャレンジしてみてください!
問題
次の選択肢のなかで、正しいものはどれでしょう? (1つ選択)
- 日付を 2022/12/31 と出力したい場合、日付フォーマット文字列は ‘Y/n/j’ もしくは ‘Y/m/d’ のどちらでもよい
- PHP 関数で出力した時刻が 9 時間ずれている場合は、タイムゾーン設定値を ‘Asia/Japan’ にするとよい
- mb_strlen(‘ABC’) と strlen(‘ABC’) の実行結果は異なる
- mb_convert_kana() 関数を利用すると、半角カナと全角カナを相互変換できるが、ひらがなをカタカナに変換することはできない
- phpinfo() 関数の代わりに、コマンドラインから -p オプションスイッチでも同じ情報を表示することができる
解答と解説は下にスクロールしてください
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
解答
正解は 1. です。
解説
1. 日付を 2022/12/31 と出力したい場合、日付フォーマット文字列は ‘Y/n/j’ もしくは ‘Y/m/d’ のどちらでもよい
選択肢のとおりです。
PHP で日付や時刻の表示をフォーマットして表示するときに使う、日付や時刻のフォーマット文字列は次のような文字を組み合わせて使います。
まずは日付に関するフォーマット文字の代表例です。
Y
: 西暦の年を4桁で表示。y
: 西暦の年を下2桁表示。m
: 月を数字2桁で表示。月が一桁のときは先頭に0が付く。1〜9月は 01〜09 と表示。n
: 月を数字で表示。1〜9月は 1〜9 と表示。d
: 日を数字2桁で表示。日が一桁のときは先頭に0が付く。1〜9日は 01〜09 と表示。j
: 日を数字で表示。1〜9日は 1〜9 と表示。
したがって、選択肢のフォーマットで 2022年1月1日 と 2022年12月31日 を表示させると次のとおりになります。
Y/n/j
: 2022/1/1、2022/12/31Y/m/d
: 2022/01/01、2022/12/31
このように、月や日で2桁揃えにするか1桁にするかでフォーマット文字を変更する必要があります。
2022年12月31日 では2つの日付フォーマット文字列の表示結果が同じ結果になってしまったということです。
日付フォーマット文字列を指定するときには、月や日が1桁のときの動作を確認しておくことが重要です。
選択肢にはないですが、時刻に関するフォーマット文字の代表例も確認しておきます。
a
: 午前/午後を小文字で表示。am/pm と表示。A
: 午前/午後を大文字で表示。AM/PM と表示。h
: 時を数字2桁で12時間表示。時が一桁のときは先頭に0が付く。1〜9時は 01〜09 と表示。H
: 時を数字2桁で24時間表示。時が一桁のときは先頭に0が付く。0〜9時は 00〜09 と表示。i
: 分を数字2桁で表示。分が一桁のときは先頭に0が付く。0〜9分は 00〜09 と表示。s
: 秒を数字2桁で表示。秒が一桁のときは先頭に0が付く。0〜9秒は 00〜09 と表示。
よく使うフォーマットで0時34分56秒を表現してみます。
h:i:s A
: 12:34:56 AMH:i:s
: 00:34:56
他にもフォーマット文字列として使用できる文字があります。詳しくは PHP 公式ドキュメントを確認してみてください。
https://www.php.net/manual/ja/datetime.format.php
【試験合格後もステップアップ!】
月初や月末、うるう年も日付フォーマット文字列を使用して取得できます。
ただし、表示が変わるだけなので元の日時データは変更されていないことに注意してください。
2022年1月15日の日付を例に次に示します。
・ Y/n/1
: 2022/1/1 のような年月の1日。
・ Y/m/01
: 2022/01/01 のような年月の1日。
・ Y/n/t
: 2022/1/31 のような年月の末日。
・ Y/m/t
: 2022/01/31 のような年月の末日。
・ t
: 指定した日付の月の日数。指定した日付の月末日を表示できるとも言える。28〜31 と表示。
・ L
: うるう年であるか。1ならうるう年。0ならうるう年ではない。
2. PHP 関数で出力した時刻が 9 時間ずれている場合は、タイムゾーン設定値を ‘Asia/Japan’ にするとよい
タイムゾーン設定値を変える手法は正しいですが、'Asia/Japan'
ではなく 'Asia/Tokyo'
です。
タイムゾーンを設定する方法は複数あります。
まず、php.ini
に設定する方法です。date.timezone
設定モードは PHP_INI_ALL
なのでどこからでも変更できます。
つまり、php.user.ini
や .htaccess
、httpd.conf
でも設定可能です。
date.timezone = "Asia/Tokyo"
PHP 関数を利用する方法です。
// スクリプト中の日付/時刻関数で使用されるデフォルトタイムゾーンを設定できます。
date_default_timezone_set('Asia/Tokyo');
// ini_set でも可能ですが、推奨はしません。
ini_set('date.timezone', 'Asia/Tokyo');
一時的にタイムゾーンを指定したいときには、DateTime
クラスや DateTimeImmutable
クラスに対して DateTimeZone
クラスを指定して利用すると良いでしょう。
【試験合格後もステップアップ!】
日時に関しては次のことも考慮しておいてください。
・ タイムゾーン。特に9時間ずれているときには世界標準時 UTC と東京標準時 Asia/Tokyo の差の影響です。
・ うるう年。4年毎と思われがちですが違います。100で割り切れる場合はうるう年にはなりませんが、400で割り切れる場合はうるう年になります。
・ うるう秒。ごくまれに60秒目が挿入されます。秒は0〜60の61個あることに注意してください。うるう秒は2035年までに段階的に廃止されるようです。
・ 日本の日付表記。PHP では元号と年、日本語表記の曜日、祝日などを PHP 標準で取得する方法はありません。外部のライブラリを利用すると良いでしょう。
・ 元号と年。西暦から元号と年に変換するときには年だけでは不十分です。年月日すべてが必要です。
・ グレゴリオ暦と太陰太陽暦。日本では明治5年12月2日以前は太陰太陽暦を使用していたため、日付が古い場合はどの暦法を用いているのか確認する必要があります。
・ Unix エポック。コンピュータの内部では 1970/01/01 0:00:00 からの経過秒で表現されることがあります。この影響で2038年問題が発生する恐れもあります。
3. mb_strlen(‘ABC’) と strlen(‘ABC’) の実行結果は異なる
mb_strlen('ABC')
と strlen('ABC')
の実行結果は同じになります。
PHP 関数のうち、mb_
で始まる関数は一般的にマルチバイト文字列関数です。
マルチバイト文字列は日本語など2バイト以上で構成される文字を正しく1文字として認識してくれます。
つまり、1文字が1バイトであるアルファベットや数字は mb_strlen()
関数を使っても strlen()
を使っても結果が同じになります。
echo mb_strlen('ABC'), PHP_EOL;
echo strlen('ABC'), PHP_EOL;
実行結果は次のとおりです。
3
3
【試験合格後もステップアップ!】
コンピュータの内部では文字もバイト(数値)として処理されています。
そのバイトと文字の対応表が文字コードです。
文字コードは国や地域別にそれぞれ発展してきました。
それを世界的に統一したのが Unicode です。
よく Unicode と UTF-8 を同じとしているケースがありますが、これは厳密には異なります。
・ 符号化文字集合(CCS) : 文字に番号を振ったペアの集合。
・ 文字符号化方式(CES) : エンコーディングのこと。CCS で文字に振られた番号をバイトに変換する。
ですので、有名どころの文字コードは次のような関係になります。
(CCS) JIS X 0201 + JIS X 0208 → (CES) Shift_JIS
Shift_JIS と Windows-31J(古い Windows のエンコード) は異なるので注意してください。
(CCS) Unicode → (CES) UTF-8、UTF-16 など
Unicode の表をバイトで表現したのが UTF-8 や UTF-16 と呼ばれるものになります。
ただ、ややこしいことに UTF-16 のことを Unicode と表現していることもあります。
4. mb_convert_kana() 関数を利用すると、半角カナと全角カナを相互変換できるが、ひらがなをカタカナに変換することはできない
mb_convert_kana()
関数ではひらがなとカタカナの相互変換も可能です。
変換オプションは組み合わせて使えます。
よく使う使用例として、次の通りです。
// 半角カタカナ、ひらがな → 全角カタカナ
$result = mb_convert_kana($str, 'KVC');
// 全角英数字 → 半角英数字, 全角スペース → 半角スペース
$result = mb_convert_kana($str, 'as');
// 半角カタカナ → 全角カタカナ, 全角英数字 → 半角英数字
$result = mb_convert_kana($str, 'KVa');
// 半角カタカナ → 全角カタカナ, 全角英数字 → 半角英数字, 全角スペース → 半角スペース
$result = mb_convert_kana($str, 'KVas');
他の変換オプションは、公式ドキュメントの mb_convert_kana
で確認してみてください。
https://www.php.net/manual/ja/function.mb-convert-kana.php
【試験合格後もステップアップ!】
日本語の濁音や半濁音で罠ともいえるのが Unicode の合成済み文字と結合文字列の違いです。
Unicode では同じ「ガ」でも、合成済み文字「ガ (U+30AC)」と結合文字列「カ (U+30AB) + ゛ (U+3099)」の2通りの方法で表示できます。
通常は日本語の表記は合成済み文字が大半なのですが、昔の Mac などでは結合文字列を利用した表記がされていた時期がありました。
この2つの表記法が混在すると並び替えや検索などで不都合が起こることがあります。
これを統一する方法として存在するのが Unicode 正規化です。
・ NFD (Normalization Form Canonical Decomposition) : 文字分解
・ NFC (Normalization Form Canonical Composition) : 文字分解→文字再合成
・ NFKD (Normalization Form Compatibility Decomposition) : 広い判定で文字分解
・ NFKC (Normalization Form Compatibility Composition) : 広い判定で文字分解→文字再合成
PHP では Normalizer クラスを利用することで変換できるようです。
https://www.php.net/manual/ja/class.normalizer.php
ただし、これはカナ以外の他の文字にも影響があります。
有名なのは旧字体の「神」が「神」に変換されてしまうことです。
安易に一括変換することをよしとせず、きちんと原理原則を把握してください。
このように Unicode にもあまり知られていない仕様がありますので、サロゲートペアや異体字など扱うときは気をつけてください。
5. phpinfo() 関数の代わりに、コマンドラインから -p オプションスイッチでも同じ情報を表示することができる
phpinfo()
情報をコマンドラインから表示する場合は -i オプションを使用します。
php -i
PHP はコマンドラインから使用することが少ないかもしれませんが、コマンドラインを利用するとわざわざ <?php phpinfo();
とだけ書いた PHP ソースコードを書く必要がなくなります。
-a
オプションスイッチは、PHP を直接コマンドラインから対話して実行できるモードになります。
これを利用して phpinfo()
を実行する方法もあります。
php -a
Interactive shell
php > phpinfo();
-r
オプションスイッチは、直後に書いた PHP コマンドを直接実行できます。
これを利用して phpinfo()
を実行する方法もあります。
php -r 'phpinfo();'
【試験合格後もステップアップ!】
他にも便利なオプションスイッチがあります。
開発や障害調査で使用できるオプションスイッチとして、次のものが役に立ちます。-l
オプションスイッチは、指定した PHP ファイルの構文チェックを行います。--ini
オプションスイッチは php.ini
関連のファイルの場所などを表示できます。-m
オプションスイッチを利用すると読み込まれているモジュールを確認することができます。
サーバーのパッケージが一部しか更新されていないなど不具合が発生している状況で、PHP の特定の関数が使えなくなることがあります。-m
オプションで調査してみるとモジュールが読み込まれていなかったなど、軽く調査することができますので、不具合が発生したときには試しに実行して見るとよいでしょう。-n
オプションスイッチは、php.ini
を無視します。
こちらも php.ini
に原因があるか確認する際に、試しに実行してみると良いでしょう。
ほかにも公式マニュアルにオプションはたくさんありますので、軽く目を通しておくと良いでしょう。
https://www.php.net/manual/ja/features.commandline.options.php