"비 복합 이름이있는 use 문은… 효과가 없습니다"문제 해결


97

내가 use Blog;맨 위에 놓을 때이 오류가 발생 합니다.

경고 : 비 복합 이름 'Blog'가있는 use 문은 다음에서 효과가 없습니다.

Blog Article, List 및 Category와 몇 가지 기능의 세 가지 클래스가있는 내 네임 스페이스입니다.

내 statememnt를 use Blog\Article;다음으로 변경 하면 작동합니다 ...

사용하려는 네임 스페이스 만 지정할 수 없습니까? 수업을 제공해야합니까?

해당 네임 스페이스 내에 함수가 있으면 어떻게합니까? 네임 스페이스 외부에서 호출하면 \Blog\각 이름 앞에 강제로 추가 됩니다.


아니, 난 어떤 프레임 워크를 사용하지 않는
thelolcat

1
namespace 이후에 내 파일 선언했을 때 발생했습니다 use Blah;.
Derek Illchuk 2016

'블로그'가 이미 포함되어 있고 두 번째로 사용하려고한다는 의미 일 수도 있습니다. 이미 상위 체인에 포함 된 프레임 워크를 사용하는 경우 일반적입니다.
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 2015 년

1
나에게 문제는 내가 전역 네임 스페이스의 심볼을 사용하려한다는 것이 었는데, 예를 들어 use \PasswordPHP는 별칭없이 그렇게하려고 할 때 그것을 좋아하지 않으므로 use \Password as Password잘 작동합니다.
Kzqai

중재자가 네임 스페이스 사용과 관련하여보다 일반적인 답변을 찾고있을 때 OOD 사용 제안에 대해 비추천을 받았습니다.
Josh Habdas

1
@JoshH 무슨 일이야? 마지막 답장도받지 못합니다. 당신은 OOP 트롤링에 대한 어떤 사람의 링크를 제공하기 위해 어떤 중재자가 찾고 있던 것이 아니라고 말하는 것에서 사라졌습니다
Sammaye

1
@JoshH (저는 사람들이 질문에 답하기위한 권위있는 자료로 이와 같은 의견이있는 블로그를 언급하는 것이 싫습니다)
Sammaye

6

usePHP명령문은 긴 네임 스페이스를 좀 더 읽기 쉬운 것으로 별칭을 지정하는 데 정말 편리합니다. 편의를 제공하는 것 외에도 개발에 영향을 미치는 파일이나 다른 작업을 실제로 포함하지 않습니다. , 이후 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유지 관리 할 수 없는 코드를 적극적으로 작성하거나 다른 사람에게 골치 아픈 일을 일으키고 자하는 경우가 아니라면 아무 것도 부르지 마십시오 .
Josh Habdas

2

클래스 정의 전에 트레이 트를 사용하려고하면 "사용 문 ...이 효과가 없습니다 ..."라는 오류 메시지가 나타납니다.

use My_trait; // should not be here

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

2

다음과 같은 'as'구문을 사용하지 않으려면

use \Blog as B;

파일에 대한 네임 스페이스 정의

namespace anyname;

use Blog
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.