Устранение неполадок «Инструкция использования с не составным именем ... не имеет никакого эффекта» - PullRequest
74 голосов
/ 16 февраля 2012

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

Предупреждение: оператор использования с не составным именем «Блог» не имеет никакого эффекта в ...

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

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

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

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

Ответы [ 5 ]

77 голосов
/ 16 февраля 2012

PHP use не то же самое, что C ++ using namespace;он позволяет вам определять псевдоним , а не "импортировать" пространство имен и, следовательно, впредь вообще не указывать квалификатор пространства имен.

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

use Blog\Article as BA;

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


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

use \ReallyLongNSName as RLNN;

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

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

21 голосов
/ 16 февраля 2014

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

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

use Yii;
use yii\db\WhatEver;

class AwesomeNewClass extends WhatEver
{
}

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

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

4 голосов
/ 16 февраля 2012

Оператор 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;
2 голосов
/ 02 апреля 2017

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

use \Blog as B;

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

namespace anyname;

use Blog
2 голосов
/ 08 июля 2016

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

use My_trait; // should not be here

class My_class{
// use My_trait; should be here instead
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...