• PHP
【php8上級/準上級試験】模擬問題解説 問題7. 名前空間とグローバル空間

「第1回 PHP 8 上級 模擬試験」を解説していきます

本記事ではひたすら下記記事の模擬試験の解説をしていきたいと思います!

第1回 PHP 8 上級 模擬試験
https://study.prime-strategy.co.jp/study/ph8ex1/

解説記事一覧

模擬問題 2

名前空間に関する説明の中で、誤っているものを1つ選びなさい。
なお「\」はバックスラッシュに読み替えること。
また、すべてのコードには下記のコードが適切な箇所に書かれているものとする。

declare(strict_types=1);
error_reporting(-1);

名前空間は、namespace キーワードを使って宣言する。
名前空間の宣言は、通常他のコードより前にファイルの先頭で宣言をする必要がある。名前空間の宣言前に書かれたクラスなどは、宣言された名前空間には含まれない。
そのため、以下のコード

class Hoge {
}

namespace Name;

class Foo {
}

$obj = new Hoge();
var_dump($obj);

を実行すると、結果は次のとおりとなる。

Fatal error: Uncaught Error: Class ‘Name\Hoge’ not found in …
これはHogeがグローバル空間で宣言をされているためなので、以下のコード

class Hoge {
}

namespace Name;

class Foo {
}

$obj = new \Hoge();
var_dump($obj);

は正しく実行でき、結果は次のとおりとなる。

object(Hoge)#1 (0) {
}

名前空間とグローバル空間

namespaceキーワードより前にクラスを宣言すると、そのクラスはグローバル空間に含まれます

⬇️

そのグローバル空間に含まれるHogeクラスを現在の名前空間(この場合は Name\Hoge)からクラスを探そうとするため

⬇️

下記のエラーが発生

Fatal error: Uncaught Error: Class 'Name\Hoge' not found in …
これはHogeがグローバル空間で宣言をされているため

つまり選択肢の文章にあるエラーの内容は正しい内容です

完全修飾名

グローバル空間のクラスを使うには \Hoge のように先頭にバックスラッシュをつけて完全修飾名を指定します

⬇️

よって下記の処理も正しい説明です

$obj = new \Hoge();
var_dump($obj);

// 出力結果
object(Hoge)#1 (0) {
}

名前空間のベストプラクティス

PHP 7以降では、名前空間の宣言は必ずしもファイルの先頭である必要はありません。ただし、ベストプラクティスとしては先頭に書くことが推奨されています

上記より説明内容は基本的に正確で、PHPの名前空間の動作を適切に説明していると言えますが、一般的なスタイルではないです →❌