web-dev-qa-db-ja.com

PHPでのクラスと名前空間のインポート:先頭の円記号はどのような違いをもたらしますか?

これら2つの違いは何ですか:

use Exception;
use \Exception;

またはそれら:

use Foo\Bar;
use \Foo\Bar;

手動 は言う:

名前空間付きの名前(FooBarなどのグローバル名ではなく、Foo\Barなどの名前空間セパレーターを含む完全修飾名前空間名)の場合、インポート名は完全修飾する必要があるため、先頭のバックスラッシュは不要であり、許可されません。現在の名前空間に関連して処理されません。

しかし、上記のすべてのバリアントが機能するため、これは本当に理解できません。つまり、「許可されていない」ことは間違いありません。

zend_do_useを調べると、is_global(先頭に円記号がある場合に設定)は、次の場合の警告にのみ使用されることがわかりました。

namespace {
    use Exception;
}

これは、「非複合名 'Exception'のuseステートメントは効果がない」ことを示しています。 (ただし、use \Exceptionで同じことを行っても効果はほとんどありませんが、警告はスローされません。)

だから:私は何かが欠けていますか?実際に違いはありますか?

46
NikiC

マニュアルでは、バックスラッシュをunnecessaryと指定しています。これは、当然、バックスラッシュを使用しても意味が同等であることを意味します。しかし、ご指摘のとおり、マニュアルには許可されていないとのことで、これは誤りです。

しかし、マニュアルには他にも問題があります。彼らはこれを宣伝します:

// importing a global class
use \ArrayObject;

インポート名が現在の名前空間に対して処理されないことが事実である場合、use \ArrayObjectuse ArrayObjectは同じ意味を持つ必要があります。グローバルなもの以外にuse ArrayObjectは何を参照できますか?実際には、エンジンはグローバルエンジンをインポートします。

また、次のようなバグがあります: http://bugs.php.net/bug.php?id=4914

基準がどうあるべきかについて混乱があると思います。

あなたの質問に答えるために:違いはありません。ただし、私がエンジン開発者であり、先行スラッシュなしの標準を信じていた場合は、誰かがuse \Exception;を書いた場合を考慮する必要はありません。おそらくそうだったと思います。

33
erisco

実際、現時点では名前空間のインポートで先頭の円記号を使用することに違いはなく、 PHPマニュアル の情報も変更されています。

名前空間名(FooBarなどのグローバル名ではなくFoo\Barなどの名前空間区切り文字を含む完全修飾名前空間名)の場合、先頭のバックスラッシュは不要であり、推奨されないことに注意してください、インポート名は完全修飾されている必要があり、現在のネームスペースに関連して処理されません。

したがって、先頭の円記号を使用することは推奨されないという本当の情報がありますが、過去に許可されていなかったという情報はありません。

だから現時点では:

use Exception;
use \Exception;

これらの2行は同じように機能しますが、最初の行を使用する必要があります。

12

通常、先頭の円記号は、識別子が絶対であることを定義します。欠落している場合、インタプリタはそれが相対識別子であると想定します。

これは絶対識別子です:

$x = new \Name\Space\To\Class();

先頭にスラッシュがないため、これは相対識別子です。現在の名前空間を基準にしています。

namespace Name\Space;
$x = new To\Class;

これは相対識別子でもあります。この場合、最後の部分(エイリアス)はクラスの最初の部分と同じであるため、useステートメントに対して解決されます。

namespace Other\Name\Space;
use Name\Space;
$x = new Space\To\Class;

ただし、namespaceおよびuseステートメントでは、絶対識別子(完全修飾名)のみが許可されるため、ここでは省略してもかまいません。 namespaceでは、先頭の円記号を設定することさえ許可されていません。

PHPがさまざまな名前空間宣言を解決する方法の詳細については、 名前空間ルールマニュアル を参照してください。

5
KingCrunch