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

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작동합니까? 클래스를 가져 오는 데 사용할 수 있습니까?



답변

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

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


답변

아니요, 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수 있으며, 필요할 때 런타임에 클래스를로드하는 데 도움이 될 수 있습니다.

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


답변

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

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

또한 명확하게하기 위해 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


답변

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


답변

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

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

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


답변

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

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

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

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

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


답변

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

위의 예제 외에는 그렇게 할 수 없습니다. 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'