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


97

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

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

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

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

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

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


нет, я не использую никакой фреймворк
— 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поскольку этот класс не имеет пространства имен.

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


ДА! Это имело смысл! :)
— Мартиньш Бриедис

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.