Получаю эту ошибку, когда ставлю use Blog;
вверху.
Предупреждение: инструкция использования с несоставным именем Blog не действует в ...
Blog
это мое пространство имен, в котором у меня есть 3 класса: статья, список и категория и несколько функций.
Если я изменю свое состояние на, use Blog\Article;
тогда он будет работать ...
Разве я не могу просто указать пространства имен, которые хочу использовать? Нужно ли мне проводить занятия?
Что, если у меня есть функции в этих пространствах имен? Когда я вызываю их за пределами пространства имен, я вынужден добавляться \Blog\
к имени каждого из них ...
php
namespaces
thelolcat
источник
источник
namespace
позжеuse Blah;
.Ответы:
PHP -
use
это не то же самое, что C ++using namespace
; он позволяет вам определять псевдоним , а не «импортировать» пространство имен и, таким образом, впредь полностью опускать квалификатор пространства имен.Итак, вы могли:
use Blog\Article as BA;
... сократить его, но полностью избавиться от него нельзя.
Следовательно,
use Blog
бесполезно, но я считаю, что вы могли бы написать:use \ReallyLongNSName as RLNN;
Обратите внимание, что вы должны использовать здесь начало,
\
чтобы синтаксический анализатор знал, чтоReallyLongNSName
он полностью квалифицирован. Это неверно дляBlog\Article
, что, очевидно, уже представляет собой цепочку пространств имен:источник
use
штука на самом деле бесполезна, с таким же успехом может быть аббревиатура для этого :)use
начальный символ \ в операторе, потому что его аргументы всегда рассматриваются как абсолютные (т. Е. Начиная с глобального пространства имен). 2)use Blog;
не обязательно бесполезен: например, из файла с пространством имен asBlog\Util\CLI
, это позволит вам писатьBlog\Entry::method()
вместо\Blog\Entry::method()
. Не то чтобы это действительно необходимо, но эффект есть. Пример такого использования см. В структуре Nette.Поскольку этот вопрос появляется как первый результат этой ошибки в Google, я расскажу, как я ее исправил.
В основном, если у вас есть фреймворк, скажем, как Yii2, вам придется объявлять такие классы, как:
use Yii; use yii\db\WhatEver; class AwesomeNewClass extends WhatEver { }
Вы получите эту ошибку,
Use Yii
поскольку этот класс не имеет пространства имен.Поскольку у этого класса нет пространства имен, он автоматически наследует глобальную таблицу символов и поэтому не требует таких вещей, как это определение, просто удалите его.
источник
use \Password
но php не нравится, когда вы пытаетесь сделать это без псевдонима, поэтому дажеuse \Password as Password
работает нормально.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;
источник
B
не вызывайте, если вы активно не пишете неподдерживаемый код или строго не желаете причинить другим головную боль.Ошибка «Оператор использования ... не действует ...» также появляется, если вы пытаетесь использовать типаж перед определением класса.
use My_trait; // should not be here class My_class{ // use My_trait; should be here instead }
источник
если вы не хотите использовать синтаксис "как", например
use \Blog as B;
определить пространство имен для файла
namespace anyname; use Blog
источник