2009-08-11 11 views
1
use MyNamespace; 

class NonPersistentStorage implements StorageInterface 

両方ともMyNamespaceにあります。それでもPHPはMyNamespace \ NonPersistentStorageとStorageInterfaceを探します(MyNamespace \ StorageInterfaceではなく)。何か不足していますか?PHPの名前空間と実装のキーワード

答えて

2

、 "使用" 宣言は絶対に何もしないこと。名前空間の階層が深い場合(たとえばFoo \ Bar \ Bazを使用)、または別名を付ける場合(FooをBarとして使用)など、名前空間をインポート(使用)する必要があります。

namespace MyNamespace; 

class NonPersistentStorage implements StorageInterface { /* ... */ } 

それとも、あなたはまた、名前空間のと同じ構文を使用して、別の関数やクラスをインポートすることを:私はあなたが、ファイル自体はMYNAMESPACE属することを宣言したいと思います。

+0

これは本当に問題でした。私は今それを笑わせることができますが、しばらくの間は完全にWTFでした。 – koen

0

は、使用してみてください:

実際
use MyNamespace; 

class NonPersistentStorage implements MyNamespace\StorageInterface 
3

PHP名前空間は、他の言語とは少し違って動作します。名前空間をインポートすると、実際にクラスをスコープに入れているわけではなく、名前空間のエイリアシングだけです。名前空間の1つのレベルだけをインポートすることは、まったく何もしません。何かをインポートしたとしても、一番下の名前空間を参照する必要があります。例えば

、あなたが持っている場合は、この:

foo.php:

blah.php:

use Bar\Baz\Biz; 

$var=new Biz\Foo(); 
ここ

namespace Bar\Baz\Biz; 

class Foo 
{} 

は、あなたがそれを使用する方法です

見る私はまだそれをインポートしても、Bizを使って参照する必要がありますか?

ただし、別名を使用してこの問題を回避することはできません。 blah.php:あなたが見ることができるように

use Bar\Baz\Biz\Foo as Foo; 

$var=new Foo(); 

、私はもはやそれを修飾する必要があります。

しかし、残念ながら、PHPでは「import all」はありません。上記のことをしたい場合は、インポートするクラスごとにエイリアスを設定する必要があります。