トラブルシューティング「複合名以外のuseステートメントは効果がない」


95

私が置いたときにこのエラーが発生する use Blog;一番上と、。

警告:コンパウンド以外の名前「Blog」のuseステートメントは効果がありません...

Blog 私の名前空間で、Article、List、Categoryといくつかの関数の3つのクラスがあります。

statememntを次のように変更した場合 use Blog\Article;ます...

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

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


いいえ、私は、任意のフレームワークを使用していないよ
thelolcat

1
namespace 後に 自分のファイルを宣言したときに私に起こりましuse Blah;
Derek Illchuk 2016年

また、「ブログ」がすでに含まれていて、もう一度使用しようとしていることを意味する場合もあります。これは、チェーンの上位にすでに含まれているフレームワークを使用している場合に一般的です。
Rhu

@DerekIllchukもしこれが私が賛成できる答えであるなら。頭痛の種をたくさん救いました。
私は一生懸命努力しますが、私はより強く泣きます

回答:


90

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

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

use Blog\Article as BA;

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


したがって、 use Blog役に立たないですが、私はあなたが書くことができると思います:

use \ReallyLongNSName as RLNN;

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

そのノート名前空間名に(例えば、名前空間の分離を含む完全修飾名前空間名、Foo\Bar 等のないグローバル名、とは対照的にFooBar)、先頭のバックスラッシュは不要ですインポート名は完全修飾でなければならないよう、お勧めしません、と処理されません現在の名前空間を基準にしています。


22
ああ吸います。だから、use実際には役に立たない、それの頭字語かもしれない:)
thelolcat

1
@thelolcat:それはその用途を持っています...あなたが望むものだけではありません。:)それそれが迷惑な制限であるかもしれないように思われます。
オービットのライトネスレース

7
この答えは、名前空間のないファイルに対してのみ正しいです。1)名前空間ファイルではuse、その引数は常に絶対(つまり、グローバル名前空間から始まる)と見なされるため、ステートメントで先頭の\を使用する必要はありません。2)use Blog;は必ずしも役に立たないわけではありません。たとえば、名前空間がのファイルから、の代わりBlog\Util\CLIに書き込むことができます。これは本当に必要なわけではありませんが、効果があります。この使用例については、Netteフレームワークを参照してください。Blog\Entry::method()\Blog\Entry::method()
Zilk 2013

24

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

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

use Yii;
use yii\db\WhatEver;

class AwesomeNewClass extends WhatEver
{
}

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

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


はい!これは理にかなっています!:)
マルティンスBriedis

1
私にとっての問題は、グローバル名前空間のシンボルを使用しようとしていることでした。たとえばuse \Password、エイリアスなしでPHP を使用しようとすると、そのシンボルが気に入らないため、問題なくuse \Password as Password動作します。
Kzqai

モデレーターが名前空間の使用に関してより一般的な答えを探していたときにOODの使用を提案することに反対しました。
Josh Habdas

1
@JoshH何してるの?私はあなたの最後の返事すら得ません。あなたは、モデレーターがOOPトローリングに関する男のリンクを提供するために探していたものではないと言っていました
Sammaye

1
@JoshH(ところで、質問に答えるための信頼できる資料として人々がそのような意見の高いブログを参照するときは嫌いです)
Sammaye

6

usePHPステートメントは、実際には、長い名前空間を少し読みやすいものにエイリアスするのに便利です。実際には、ファイルを含めたり、その他のことを行ったりすることはありません。開発に影響を与えるだけでなく、利便性も提供します。なので、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;

1
B保守不可能なコードを積極的に記述している場合、または他の人の頭痛の種を引き起こしたい場合を除き、何も呼び出さないでください。
Josh Habdas

2

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

use My_trait; // should not be here

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

2

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

use \Blog as B;

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

namespace anyname;

use Blog
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.