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();
하지만 사용하지 않고 클래스를 가져올 require
나 include
. 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
경유 composer
와psr
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'