7

Exception以下は、再宣言できないことを示すエラーをスローします。

namespace \NYTD\ReadingListBackend;

class Exception extends \Exception
{
}

ただし、\名前空間宣言でプレフィックスを削除しても、次のことはできません。

namespace NYTD\ReadingListBackend;

私は最近 PHP 名前空間を採用しました。私の理解では、接頭辞が付いた名前空間は完全修飾名\を表します。

では、名前空間宣言でプレフィックスを使用できないのはなぜですか? 参照するときにできます(例new \NYTD\ReadingListBackend\Exception)。docsに何も見つからなかったので、完全な説明をいただければ幸いです。

4

3 に答える 3

8

他の回答で述べたように、namespace宣言は常に完全修飾名を取るため、末尾\は冗長になり、許可されません。

書き込むnamespace \NYTD\ReadingListBackend { ... }と、適切な解析エラーが発生します。

namespace \NYTD\ReadingListBackend;一方、セミコロン表記を使用するnamespace\NYTD\ReadingListBackend;と、定数へのアクセスであるとして解釈されますNYTD\ReadingListBackendnamespaceここでのキーワードは、現在アクティブな名前空間に解決されます。この場合、これはグローバルなものです)。

したがって、コードは名前空間を宣言せず (グローバルです)、定数にアクセスしようとします。そのため、 を再定義することになりますException

ちなみに未定義の定数アクセスが致命的なエラーにならないのはクラス巻き上げです。クラス宣言が最初に評価されるため、PHP が実際に定数アクセスに到達することはありません (コード内で最初に到達したとしても)。

于 2012-10-26T20:42:05.333 に答える
2

では、なぜ名前空間宣言でプレフィックスを使用できないのですか?

定義上、名前空間名を宣言する、すでに完全に修飾されています。

ただし、コードの名前空間の一部で、完全修飾クラス名(FQCN)を指定する必要がある場合は、クラス名がFQCNであることをPHPに通知するためのプレフィックスが必要です。

ここで苛立たしいのは、あなたの例では、解析時にPHPがまだエラーになっていないことです。理由はわかりません。

namespace \NYTD\ReadingListBackend;
          ^- this seems wrong but no parse error

ただし、PHPはカーリー表記(1つのファイルに複数の名前空間)を使用してエラーを実行します。

namespace \NYTD\ReadingListBackend {}
                                   ^- parse error in this line

しかし、あなたの質問については、名前空間名とクラス名を区別する価値があると思います。

于 2012-10-26T17:01:56.990 に答える
1

\プレフィックスは「ルート」などを意味します。修飾された名前空間( ) の完全修飾された名前空間( ) を作成します。これは、名前空間を宣言する場合ではなく、名前空間を使用する場合にのみ役立ちます。例えば:/Foo/BarFoo/Bar

namespace Foo

class Bar {
    // ...
}

namespace Bar\Baz;

$b = new Bar(); // look for Bar\Baz\Bar()
$b = new Foo\Bar(); // look for Bar\Baz\Foo\Bar()
$b = new \Foo\Bar(); // look for Foo\Bar() (the right one)

名前空間を宣言するときは、常にグローバル ('root') 名前空間から名前空間を宣言するため、役に立ちません。

namespace Foo; // the \Foo namespace
// ...
namespace Bar; // the \Bar namespace, not the \Foo\Bar namespace
// ...
namespace Foo\Bar; // the \Foo\Bar namespace

すべての名前空間宣言は一種の「完全修飾」であるため、PHP は\名前空間の前に を必要とせず、エラーが発生します。

于 2012-10-26T15:36:35.247 に答える