2013-07-19 10 views
36

私はPHP 5.4を使用しており、次のようなPSR-0クラス構造を持っています。名前が既に使用中であるため、XがYとして使用できません。

A \ライブラリ\ Session.php

namespace A\Library; 

class Session { ... } 

私\アプリケーション\ Session.php

namespace My\Application; 

class Session { ... } 

私\アプリケーション\ Facebook.php

namespace My\Application; 
use A\Library\Session; 

class Facebook { ... } 

私は、アプリケーションを実行しようとすると、私は次のエラーを取得する:

Cannot use A\Library\Session as Session because the name is already in use in My\Application\Facebook.php

それは、少なくともではない、このファイルでは、ありませんにもかかわらず。 Facebook.phpファイルは、Facebookクラスのみを宣言し、という1つのSessionクラスをインポートします。

私が見ることができる唯一の問題は、別のSessionクラスはFacebookのクラスと同じ名前空間に存在しますが、それはFacebook.phpファイルにインポートされなかったとして、私はそれが全く問題ではありませんでしたと思ったということです。

私は間違っています(この場合、関連するドキュメントを参照してください)か、これはバグですか?

+0

私は現在問題を見ていないので、より多くのコードが必要になる可能性があります – exussum

+0

私の場合、私は名前空間に間違いを犯しました... –

答えて

23

ご覧の行動に影響を与える可能性がPHPで確認バグがありUsing namespaces: Aliasing/Importing

use A\Library\Session;

で述べたように同じです。致命的なエラーが発生するはずですが、opcacheを有効にすると、完全に実行される可能性があります。

https://bugs.php.net/bug.php?id=66773

、それはまだあなたに関係する場合は、バグのために投票してください。

+0

これは本当にバグだったように見えます。あなたが言及した[#66862](https://bugs.php.net/bug.php?id=66862)のバグは、2016年11月10日に修正されました。 – Benjamin

+1

サーバー上でphp-fpmを再起動すると、私のために解決しました – didiliche

+0

@ dlicheおそらく、PHPが最後の再起動から更新されたためです。 – Benjamin

10

The only problem I can see is that another Session class exists in the same namespace as the Facebook class, but as it was never imported in the Facebook.php file, I thought it did not matter at all.

はい、問題ありません。このため、同じ名前空間からクラスを「インポート」する必要はありません。異なる名前空間の名前が競合する場合は、クラスの別名を付ける必要があります。

namespace My\Application; 
use A\Library\Session as ASession; // choose a proper alias name here 

class Facebook { ... } 
+0

私はまだなぜ理解していません。私には、 'My \ Application'の中からSessionを使用し、このために' use'がなければ 'My \ Application \ Session'と解決します。しかし、もしあれば、これを使うでしょう。ドキュメントでは、インポートはファイルごとに*ということが明らかですが、なぜ別のファイルで定義されたクラスが検索されるのでしょうか? – Benjamin

+0

問題を引き起こすのはuseステートメントではありません。問題は、\ My \ Application名前空間に\ My \ Application \ Sessionクラスがあることです。したがって、別のSessionクラスを¥My¥Application名前空間のスコープに(使用して)インポートすると、競合するSessionクラスが発生します。 –

+0

しかし、PHPは動的な言語なので、インタプリタはこの名前空間にSessionクラスがあることを*知っていない*かもしれないので、それは重要ではありませんか? – Benjamin

22

いいえ、これはバグではありません。だから、のようなものを使用してみてください

use A\Library\Session as Session; 

use A\Library\Session as AnotherSessionClassName; 
+0

私がジョンカートライトに言ったように、それは今働き、私は理由を説明することができません。これはあなたの答えに逆らっているように見えます。あなた自身でそれを再現しようとしましたか?これに関するコメント? – Benjamin

+0

あなたのケースを再現しようとしました。だからあなたのディレクトリ構造、つまりA \ LibraryとMy \ Applicationと上記のファイルを作成し、セッションオブジェクトを作成するためにFacebook.phpの最後にいくつかのテストコードを追加しました。しかし、セッションクラスをインポートするために 'use'節をどのように使ったのか分かりませんでした。 'require( '../../A/Library/Session.php');'を 'use'文の前に追加して、それは完全に機能しました! – Mohsenme

+0

'use'は現在のファイルのFQCNの短い名前をエイリアスし、' require'はターゲットファイルに含まれているコードを実行しますが、それらは全く異なります!どういう意味ですか? – Benjamin

関連する問題