use MyNamespace;
class NonPersistentStorage implements StorageInterface
両方ともMyNamespaceにあります。それでもPHPはMyNamespace \ NonPersistentStorageとStorageInterfaceを探します(MyNamespace \ StorageInterfaceではなく)。何か不足していますか?PHPの名前空間と実装のキーワード
use MyNamespace;
class NonPersistentStorage implements StorageInterface
両方ともMyNamespaceにあります。それでもPHPはMyNamespace \ NonPersistentStorageとStorageInterfaceを探します(MyNamespace \ StorageInterfaceではなく)。何か不足していますか?PHPの名前空間と実装のキーワード
、 "使用" 宣言は絶対に何もしないこと。名前空間の階層が深い場合(たとえばFoo \ Bar \ Bazを使用)、または別名を付ける場合(FooをBarとして使用)など、名前空間をインポート(使用)する必要があります。
namespace MyNamespace;
class NonPersistentStorage implements StorageInterface { /* ... */ }
それとも、あなたはまた、名前空間のと同じ構文を使用して、別の関数やクラスをインポートすることを:私はあなたが、ファイル自体はMYNAMESPACE属することを宣言したいと思います。
は、使用してみてください:
実際use MyNamespace;
class NonPersistentStorage implements MyNamespace\StorageInterface
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」はありません。上記のことをしたい場合は、インポートするクラスごとにエイリアスを設定する必要があります。
これは本当に問題でした。私は今それを笑わせることができますが、しばらくの間は完全にWTFでした。 – koen