Устранение неполадок «Оператор использования с несоставным именем… не действует»

97

Получаю эту ошибку, когда ставлю use Blog;вверху.

Предупреждение: инструкция использования с несоставным именем Blog не действует в ...

Blog это мое пространство имен, в котором у меня есть 3 класса: статья, список и категория и несколько функций.

Если я изменю свое состояние на, use Blog\Article;тогда он будет работать ...

Разве я не могу просто указать пространства имен, которые хочу использовать? Нужно ли мне проводить занятия?

Что, если у меня есть функции в этих пространствах имен? Когда я вызываю их за пределами пространства имен, я вынужден добавляться \Blog\к имени каждого из них ...

thelolcat
источник
нет, я не использую никакой фреймворк
thelolcat
1
Со мной случилось, когда я объявил свое дело namespace позже use Blah; .
Дерек Ильчук
Это также может означать, что «Блог» уже включен, и вы пытаетесь использовать его во второй раз. Это обычное дело, если вы используете фреймворк, который уже включил его выше по цепочке.
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;не обязательно бесполезен: например, из файла с пространством имен as Blog\Util\CLI, это позволит вам писать Blog\Entry::method()вместо \Blog\Entry::method(). Не то чтобы это действительно необходимо, но эффект есть. Пример такого использования см. В структуре Nette.
Zilk
24

Поскольку этот вопрос появляется как первый результат этой ошибки в Google, я расскажу, как я ее исправил.

В основном, если у вас есть фреймворк, скажем, как Yii2, вам придется объявлять такие классы, как:

use Yii;
use yii\db\WhatEver;

class AwesomeNewClass extends WhatEver
{
}

Вы получите эту ошибку, Use Yiiпоскольку этот класс не имеет пространства имен.

Поскольку у этого класса нет пространства имен, он автоматически наследует глобальную таблицу символов и поэтому не требует таких вещей, как это определение, просто удалите его.

Sammaye
источник
ДА! Это имело смысл! :)
Мартиньш Бриедис
1
Для меня проблема заключалась в том, что я пытался использовать символ из глобального пространства имен, например, use \Passwordно php не нравится, когда вы пытаетесь сделать это без псевдонима, поэтому даже use \Password as Passwordработает нормально.
Kzqai 02
Проголосовали против предложения использовать OOD, когда модератор искал более общий ответ относительно использования пространств имен.
Джош Хабдас
1
@JoshH, о чем ты? Я даже не получил твоего последнего ответа. Вы ушли от того, чтобы сказать, что это не то, что искал какой-то модератор, к тому, чтобы дать ссылку какого-то парня о троллинге без
рекламы
1
@JoshH (кстати, я ненавижу, когда люди ссылаются на такие самоуверенные блоги как на авторитетный материал для ответа на вопрос)
Sammaye
6

useЗаявление в PHP действительно просто удобство для псевдонима длинного пространства имен в то , что может быть немного легче читать. На самом деле он не включает никаких файлов и не делает ничего другого, что влияет на вашу разработку, кроме удобства. Поскольку, 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не вызывайте, если вы активно не пишете неподдерживаемый код или строго не желаете причинить другим головную боль.
Джош Хабдас
2

Ошибка «Оператор использования ... не действует ...» также появляется, если вы пытаетесь использовать типаж перед определением класса.

use My_trait; // should not be here

class My_class{
// use My_trait; should be here instead
}
Дитер Доннерт
источник
2

если вы не хотите использовать синтаксис "как", например

use \Blog as B;

определить пространство имен для файла

namespace anyname;

use Blog
Samehanwar
источник