web-dev-qa-db-ja.com

トラブルシューティング「非複合名のuseステートメント...は効果がありません」

use Blog;を上部に配置すると、このエラーが発生します。

警告:非複合名「Blog」のuseステートメントは、次の場合には効果がありません...

Blogは3つのクラス(Article、List、Category、およびいくつかの関数)を持つ私の名前空間です。

Statememntをuse Blog\Article;に変更すると、動作します...

使用したい名前空間だけを指定することはできませんか?クラスを提供する必要がありますか?

その名前空間内に関数がある場合はどうなりますか?名前空間の外でそれらを呼び出すと、それぞれの名前の前に\Blog\を追加しなければなりません...

74
thelolcat

PHPのuseは、C++のusing namespaceとは異なります。名前空間を「インポート」するのではなく、エイリアスを定義できるため、今後は名前空間修飾子を完全に省略します。

だから、あなたはすることができます:

use Blog\Article as BA;

...短縮することはできますが、完全に取り除くことはできません。


したがって、use Blogは役に立たないが、次のように書くことができると思う。

use \ReallyLongNSName as RLNN;

ここで先頭の\を使用して、ReallyLongNSNameが完全修飾されていることをパーサーに認識させる必要があることに注意してください。これはBlog\Articleには当てはまりません。これは明らかに名前空間のチェーンです。

名前空間名の(反対に、Foo\Barなどの名前空間セパレータを含む完全修飾された名前空間名FooBar)などのそうでないグローバル名には、先行するバックスラッシュは不要ですインポート名は完全修飾である必要があり、現在のネームスペースに関連して処理されないため、推奨されます。

この質問は、このエラーに対するGoogleでの最初の結果として表示されるため、修正方法を説明します。

基本的に、フレームワークがある場合、Yii2のように言うと、次のようなクラスを宣言する必要があります。

use Yii;
use yii\db\WhatEver;

class AwesomeNewClass extends WhatEver
{
}

このクラスには名前空間がないため、Use Yiiでこのエラーが発生します。

このクラスには名前空間がないため、グローバルシンボルテーブルを自動的に継承するため、この定義のようなものは必要ありません。削除するだけです。

22
Sammaye

PHPでのuseステートメント は、長い名前空間を読みやすくするためにエイリアスを作成するのに便利です。実際には、利便性を提供することに加えて、開発に影響するファイルやその他の操作は一切含まれていません。なぜなら、Blogは、利便性が得られないものとしてエイリアス化されていないからです。次のようなことができると想像できます

use \Blog as B;

そしてそれはうまくいくかもしれません。 (実際にはここで不明瞭にすることで利便性を失うと主張することができますが、それは問題ではありません)実際にBlog名前空間を何かにエイリアスしているためそれ以外。 Blog\Articleを使用すると、ドキュメントによると:

// this is the same as use My\Full\NSname as NSname
use My\Full\NSname;

したがって、スニペットは次と同等になります。

use Blog\Article as Article;
4

次のような「as」構文を使用したくない場合

use \Blog as B;

ファイルの名前空間を定義する

namespace anyname;

use Blog
2
samehanwar

クラス定義の前に特性を使用しようとすると、「useステートメント...は効果がありません...」というエラーも表示されます。

use My_trait; // should not be here

class My_class{
// use My_trait; should be here instead
}
2
Dieter Donnert