PHP8上級資格取得へ向けたアウトプット記事になります。
PHP試験運営団体より公開されている模擬試験を1つ1つみていく形で事細かくみていきますが、勉強途中ゆえ間違っている部分に関してはご了承ください。
PHP上級資格のメイン教材はPHPマニュアルと指定されていますので、このマニュアルを主に踏襲した内容となっています。
試験問題1-2 | 模擬試験を解く#1 |
---|---|
試験問題3 | 模擬試験を解く#2 |
試験問題4 | 模擬試験を解く#3 |
試験問題5 | 模擬試験を解く#4 |
試験問題6 | 模擬試験を解く#5 |
本記事 | 模擬試験を解く#6 |
試験問題8 | 模擬試験を解く#7 |
主な勉強教材は以下になります。
1.独習PHP第4版
2.はじめてのPHP
3.PHP公式マニュアル
PHP8上級試験模擬問題
試験問題7
名前空間に関する説明の中で、誤っているものを1つ選びなさい。
なお「¥」はバックスラッシュに読み替えること。
また、すべてのコードには下記のコードが適切な箇所に書かれているものとする。
選択肢?
名前空間は、namespace
キーワードを使って宣言する。
名前空間の宣言は、通常他のコードより前にファイルの先頭で宣言をする必要がある。名前空間の宣言前に書かれたクラスなどは、宣言された名前空間には含まれない。
そのため、以下のコード
を実行すると、結果は次のとおりとなる。
これはHogeがグローバル空間で宣言をされているためなので、以下のコード
は正しく実行でき、結果は次のとおりとなる。
ここでは名前空間について深掘っていきたいと思います。
名前空間の基本
・namespaceより前に宣言されたクラスは宣言した名前空間には含まれない(「<?php」以外の全ての文字や改行などは存在不可)
・明示的に名前空間を宣言せずにクラスの宣言を行った場合、グローバル名前空間としてトップ階層の名前空間に属するものとみなされる
・「非修飾名」とは、名前空間を含まない名前のこと相対パスのようなイメージ
・「修飾名」とは、名前空間の階層区切りを含んだ名前のこと相対パスのようなイメージ
・「完全修飾名」とは、「\」で始まる修飾名のことで絶対パスのようなイメージ
この選択肢のコードではnamespaceキーワードよりも前にHogeクラスが宣言されているため、誤りとなります。
選択肢?
名前空間は、namespace
キーワードを使って宣言する。
また、名前空間はディレクトリやファイルと同様に、名前空間の階層構造を指定することができる。
そのため、以下のコード
を実行すると、結果は次のとおりとなる。
ディレクトリやファイルと同様、PHP の名前空間においても名前空間の階層構造を指定することができるため、この選択肢は合っています。
選択肢?
名前空間の定義がない場合、すべてのクラスや関数の定義はグローバル空間に配置される。PHP で定義済みのクラスも、グローバル空間に配置される。
先頭に ¥
(バックスラッシュ) を付けると、名前空間の内部からであってもグローバル空間の名前を指定することができる。
そのため、以下のコード
を実行すると、結果は次のとおりとなる。
一方で以下のコード
を実行すると in to catch
?となる。
ここでは選択肢?で紹介した「完全修飾名」について問われています。
また、Exceptionクラスはすべてのユーザー定義例外のスーパークラス(基底クラス)です。
Exceptionクラスを利用したい場合は、グローバル名前空間に属するExceptionクラスを利用することになるため、「new ?Exception()」と記述する必要があります。
よって、この選択肢は合っています。
選択肢?
PHP でのエイリアス作成には use
演算子を使用する。
use
で指定する名前空間付きの名前の、先頭のバックスラッシュは不要で、推奨されない。
そのため、以下のコード
は正しく実行でき、結果は次のとおりとなる。
ここではuseキーワードに関して問われています。
useキーワードによって型のインポートを行うことで、それ以降は名前空間を省略して本来のクラス名だけで表記できるようになるものです。
useキーワードの基本
・use命令はクラス、関数、制御文などのスコープの内部で呼び出せないため、必ずグローバルスコープかnamespaceブロック配下で呼び出す(use命令はコンパイルのタイミングでインポートを実行するため)
・インポートの有効範囲はファイル単位(現在のファイルでのみ認識)
・定数(use const)、関数(use function)のインポートも可能
・名前空間をインポートした場合は、名前空間の最後+定数名/関数名でそれぞれ定数/関数を呼び出せる
・as句を付与することでエイリアス(別名)をつけることが可能
・use命令のグループ化も可能
よって、この選択肢は合っています。