Устранение неполадок "Операция использования с не-составным именем... не влияет"

Получение этой ошибки, когда я положил use Blog; вверху.

Предупреждение. Оператор использования с не-составным именем "Блог" не влияет в...

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

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

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

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

Ответ 1

PHP use - это не то же самое, что С++ using namespace; он позволяет вам определить псевдоним, а не "импортировать" пространство имен и, следовательно, впредь полностью отказаться от спецификатора пространства имен.

Итак, вы можете сделать:

use Blog\Article as BA;

..., чтобы сократить его, но вы не можете полностью избавиться от него.


Следовательно, use Blog бесполезно, но я считаю, что вы могли бы написать:

use \ReallyLongNSName as RLNN;

Обратите внимание, что здесь необходимо использовать ведущий \, чтобы заставить анализатор понять, что ReallyLongNSName полностью соответствует требованиям. Это неверно для Blog\Article, который, очевидно, уже является цепочкой пространств имен:

Обратите внимание на то, что для имен с именами (полное имя пространства имен, содержащее разделитель пространства имен, например Foo\Bar , в отличие от глобальных имен, которые не имеют значения, например FooBar), ведущая обратная косая черта не нужна и не рекомендуется, так как имена импорта должны быть полностью квалифицированы и не обрабатываться относительно текущего пространства имен.

Ответ 2

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

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

use Yii;
use yii\db\WhatEver;

class AwesomeNewClass extends WhatEver
{
}

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

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

Ответ 3

Оператор 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;

Ответ 4

Ошибка "Оператор использования... не имеет эффекта..." также появляется, если вы пытаетесь использовать признак перед определением класса.

use My_trait; // should not be here

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

Ответ 5

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

use \Blog as B;

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

namespace anyname;

use Blog