Усунення несправностей “Заява про використання з несполученою назвою… не впливає”


97

Отримання цієї помилки, коли я ставлю use Blog;вгорі.

Попередження: Заява про використання із несполученою назвою "Блог" не впливає на ...

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

Якщо я зміню свою заяву на, 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;не обов'язково марний: наприклад, з файлу, розміщеного як 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оскільки цей клас не має простору імен.

Оскільки цей клас не має простору імен, він автоматично успадковує глобальну таблицю символів і тому не потребує подібних речей, просто видаліть її.


ТАК! Це мало сенс! :)
Mārtiņš Briedis

1
Для мене проблема полягала в тому, що я намагався використовувати символ із глобального простору імен, наприклад, use \Passwordале php не любить, коли ви намагаєтесь зробити це без псевдоніма, тому навіть use \Password as Passwordчудово працює.
Kzqai 02

Проголосували за пропозицію використання ООД, коли модератор шукав більш загальної відповіді щодо використання просторів імен.
Джош Хабдас,

1
@JoshH, про що ти? Навіть останньої Вашої відповіді я не отримую. Ви перейшли від того, що сказали, що це не те, що шукав якийсь модератор, і дали посилання якогось хлопця про тролінг ООП
Sammaye

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.