키워드 "use"는 PHP에서 어떻게 작동하며 클래스를 가져올 수 있습니까?


136

class 파일이 Resp있습니다. 경로는 다음과 같습니다

C:\xampp\htdocs\One\Classes\Resp.php

그리고 나는이 index.php이 디렉토리에있는 파일을 :

C:\xampp\htdocs\Two\Http\index.php

index.php파일에서 클래스를 인스턴스화하고 싶습니다 Resp.

$a = new Resp();

클래스를 사용 하여 파일을 포함하기 위해 require또는 include키워드를 사용할 수 있다는 것을 알고 있습니다 .

require("One\Classes\Resp.php");       // I've set the include_path correctly already ";C:\xampp\htdocs". It works.
$a = new Resp();

하지만 사용하지 않고 클래스를 가져올 requireinclude. use키워드 작동 방식을 이해하려고 합니다. 이 단계를 시도했지만 아무것도 작동하지 않습니다.

use One\Classes\Resp;
use xampp\htdocs\One\Classes\Resp;
use htdocs\One\Classes\Resp;
use One\Classes;
use htdocs\One\Classes;    /* nothing works */

$a = new Resp();

그것은 말한다 :

Fatal error: Class 'One\Classes\Resp' not found in C:\xampp\htdocs\Two\Http\index.php

키워드는 어떻게 use작동합니까? 클래스를 가져 오는 데 사용할 수 있습니까?


1
파일을 가져 오지 않고서는 할 수 없습니다. 흐름을 바꾸지 마십시오. 또한 네임 스페이스는 실제로 PHP에서 사용되지 않습니다. VB.NET과 마찬가지로
Cole Johnson

13
@ cole-johnson, 당신의 의견에 동의하지 않습니다. Symfony는 namespaces를 중심으로 구축되었습니다 . 네임 스페이스를 사용하지 않으면 실제로 Symfony가 없습니다
Green

답변:


80

use아무것도 포함하지 않습니다. 지정된 네임 스페이스 (또는 클래스)를 현재 범위로 가져옵니다.

당신이 원하는 경우 클래스는 자동으로 적재된다 -에 대해 읽어 자동 로딩


@ G-Man 그것은 바로 질문에 대답합니다.
zerkms

188

아니요, use키워드를 사용 하여 수업을 가져올 수 없습니다 . include/ require문 을 사용해야 합니다. PHP 자동 로더를 사용하더라도 여전히 자동 로더는 내부 include또는 require내부 를 사용해야합니다 .

사용 목적 키워드 :

동일한 이름을 가진 두 개의 클래스가있는 경우를 고려하십시오. 이상하게 느껴지 겠지만 큰 MVC 구조로 작업 할 때 발생합니다. 이름이 같은 클래스가 두 개인 경우 다른 네임 스페이스에 넣으십시오. 이제 자동 로더가 두 클래스를 모두로드 할 때 (by by require)를 고려하고 클래스 객체를 사용하려고합니다. 이 경우 컴파일러는 두 클래스 중 어떤 클래스 객체를로드할지 혼동합니다. 컴파일러가 결정을 내리는 데 도움을주기 위해 use명령문을 사용하여 어느 것이 사용될 것인지 결정할 수 있습니다.

현재 주요 프레임 워크 사용을 include또는 require경유 composerpsr

1) 작곡가

2) PSR-4 오토로더

그것들을 통과하면 더 도움이 될 수 있습니다. 별명을 사용하여 정확한 클래스를 처리 할 수도 있습니다. 이름이 같은 두 개의 클래스가 있고 Mailer두 개의 서로 다른 네임 스페이스 가 있다고 가정하십시오 .

namespace SMTP;
class Mailer{}

namespace Mailgun;
class Mailer{}

그리고 두 Mailer 클래스를 동시에 사용하려면 별명을 사용할 수 있습니다.

use SMTP\Mailer as SMTPMailer;
use Mailgun\Mailer as MailgunMailer;

나중에 클래스 객체에 액세스하려면 코드에서 다음을 수행하십시오.

$smtp_mailer = new SMTPMailer;
$mailgun_mailer = new MailgunMailer;

원래 클래스를 참조합니다.

일부 클래스는 비슷한 클래스 이름이없고 use키워드를 사용하지 않는다고 혼동 될 수 있습니다 . 글쎄, 당신은 인수로 사용될 클래스와 함께 명령문이 실행될 __autoload($class)때 자동으로 호출되는 함수를 사용할 use수 있으며, 필요할 때 런타임에 클래스를로드하는 데 도움이 될 수 있습니다.

클래스 오토로더에 대한 자세한 내용은 이 답변 을 참조하십시오 .


왜 다른 클래스 이름을 사용하지 않습니까?
신성한

15
@신성한. 수업은 타사 공급 업체에서 제공 될 수 있습니다.
Dayo

3
@신성한. 충돌하는 두 클래스가 모두 타사에서 온 경우 어떻게됩니까?
Dayo

2
@divine 규칙에 따라 네임 스페이스는 <vendorName> / <packageName>이되어 이미 해결 된 방식입니다. 관례에 따라 packagist는 다른 사람으로부터 동일한 공급 업체 이름을 수락 할 수 없습니다. packagist.org는 패키지 작성기 설치에 사용되는 PHP 저장소입니다.
Tpojka

1
@root는 중요하지 않으며 런타임에 사용 대상을 알려줍니다. 당신이 차를 운전하고 신호처럼 당신이 앞서 범프를 말하고 깨는 것처럼, use명령문이 컴파일러가 이것을 나를 위해로드하도록 지시하는 것처럼 . 맙소사!
Rajan Rawal

23

네임 스페이스 가 무엇인지 다시 생각하지 마십시오 .

네임 스페이스 는 기본적으로 클래스 경로 고유성 을 보장하기 위한 클래스 접두사 (운영 체제의 디렉토리) 입니다.

또한 명확하게하기 위해 use 문은 네임 스페이스의 별칭을 지정하는 작업을 수행하지 않으므로 바로 가기를 사용하거나 이름이 같지만 네임 스페이스 가 다른 클래스 를 동일한 파일에 포함시킬 수 있습니다 .

예 :

// You can do this at the top of your Class
use Symfony\Component\Debug\Debug;

if ($_SERVER['APP_DEBUG']) {
    // So you can utilize the Debug class it in an elegant way
    Debug::enable();
    // Instead of this ugly one
    // \Symfony\Component\Debug\Debug::enable();
}

PHP 네임 스페이스와 자동로드 (구식 방식과 Composer의 새로운 방식)가 어떻게 작동하는지 알고 싶다면이 주제에 대해 방금 쓴 블로그 게시물을 읽을 수 있습니다. https://enterprise-level-php.com/ 2017 / 12 / 25 / the-magic-behind-autoloading-php-files-using-composer.html


8

어쨌든 클래스를 포함 / 요구해야합니다. 그렇지 않으면 PHP는 네임 스페이스에 대해 알지 못합니다. 그러나 동일한 파일
에서 수행 할 필요는 없습니다 . 예를 들어 부트 스트랩 파일에서이를 수행 할 수 있습니다. (또는 오토로더를 사용하지만 실제로는 주제가 아닙니다)


4

문제는 클래스 이름 (이 경우 '\'으로 구분)을 가져와 디렉토리 구조에 매핑하는 자동 로더를 사용해야 할 가능성이 높습니다.

PHP 의 자동 로딩 기능 에 대해이 기사를 확인할 수 있습니다 . 프레임 워크에는 이미 이러한 유형의 기능 구현이 많이 있습니다.

실제로 한 번 구현했습니다. 여기 링크가 있습니다.


그래도 문제가 있습니다. 전체 경로를 만들려면 재귀 모델이 필요합니다. 현재는 단일 레벨 네임 스페이스 만 처리합니다.
Tyler Carter

3

Green에 동의합니다. Symfony에는 네임 스페이스가 필요합니다. 왜 사용하지 않습니까?

컨트롤러 클래스의 예는 다음과 같습니다.

네임 스페이스 Acme \ DemoBundle \ Controller;

Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller를 사용하십시오.

WelcomeController 클래스는 컨트롤러 {...}를 확장합니다


3

클래스를 가져 오는 데 사용할 수 있습니까?

위의 예제 외에는 그렇게 할 수 없습니다. use클래스 내 에서 키워드를 사용하여 다음과 같이 특성 을 가져올 수도 있습니다 .

trait Stuff {
    private $baz = 'baz';
    public function bar() {
        return $this->baz;
    }
}

class Cls {
    use Stuff;  // import traits like this
}

$foo = new Cls;
echo $foo->bar(); // spits out 'baz'

3

use키워드는 PHP에서 앨리어싱을위한이며 클래스를 가져 오지 않습니다. 이것은 실제로 도움이됩니다
1) 다른 네임 스페이스에 동일한 이름을 가진 클래스가있는 경우
2) 정말 긴 클래스 이름을 반복해서 사용하지 마십시오.


2

네임 스페이스는 클래스를 포함하는 특정 파일의 경로를 정의하는 데 사용됩니다.

namespace album/className; 

class className{
//enter class properties and methods here
}

다음과 같이 "use"라는 키워드를 사용하여이 특정 클래스를 다른 PHP 파일에 포함시킬 수 있습니다.

use album/className;

class album extends classname {
//enter class properties and methods
}

참고 : 구현할 클래스가 포함 된 파일의 경로를 사용하지 말고 사용 인스턴스를 확장하여 개체를 인스턴스화하고 네임 스페이스 만 사용하십시오.


2

"use"라는 키워드를 사용하면 네임 스페이스 리터럴을 단축 할 수 있습니다. 앨리어싱을 사용하거나 사용하지 않고 둘 다 사용할 수 있습니다. 별칭이 없으면 전체 네임 스페이스의 마지막 부분을 사용해야합니다.

<?php
    use foo\bar\lastPart;
    $obj=new lastPart\AnyClass(); //If there's not the line above, a fatal error will be encountered.
?>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.