접두사를 넘어서: PHP 네임스페이스에 대한 WordPress 개발자 가이드

게시 됨: 2019-11-12

모든 것에 접두사를 붙입니다.

WordPress 소프트웨어 자체로 오래된 격언입니다. 접두사는 WordPress 개발자의 표준이었기 때문에 다른 작업을 상상하기 어렵습니다. 그러나 새로운 것이 필요한 때입니다. 글쎄, 그것은 기한이 지났지 만 WordPress는 더 큰 PHP 세계에서 표준 관행에서 약간 뒤떨어져 있습니다.

접두사는 프로젝트 이름의 코드 친화적인 버전을 만들고 이를 전역 네임스페이스의 함수, 클래스 및 기타 항목 앞에 붙이는 방식입니다. 예를 들어, 함수 이름 충돌을 피하기 위해 get_post tavern_get_post() 대신 get_post() 이름을 지정하면 치명적인 오류가 발생할 수 있습니다.

접두사는 "네임 스페이싱"의 한 형태로, 이 공간의 이름이 특정 프로젝트에 속한다는 멋진 표현입니다. 그러나 접두사(및 덜 일반적인 접미사)는 PHP 언어에 대한 솔루션이 없었을 때부터 해킹입니다.

PHP 5.3은 공식 네임스페이스 방법을 도입했기 때문에 표준은 수년 동안 존재해 왔습니다. WordPress 5.2가 최소 PHP 요구 사항을 5.6으로 높였기 때문에 개발자가 오래된 습관을 버리고 나머지 PHP 세계를 따라잡아야 할 때입니다.

네임스페이스(거의) 모든 것

PHP 네임스페이스는 다음 항목만 다룹니다.

  • 클래스
  • 인터페이스
  • 특성
  • 기능
  • const 키워드로 선언되었지만 define() 이 아닌 상수

스크립트 핸들, 이미지 크기 이름, 데이터베이스 옵션 및 전역 네임스페이스의 기타 항목에 관해서는 여전히 접두사를 붙여야 합니다. 이는 ID이며 PHP 네임스페이스 범위를 벗어납니다.

네임스페이스를 만드는 방법

네임스페이스는 선언하기 쉽습니다. 특정 네임스페이스를 사용하려는 PHP 파일의 맨 위에서 다음 코드 스니펫과 같이 선언합니다.

 <?php

네임스페이스 선술집;

이 코드 라인이 하는 일은 이 특정 파일 내의 모든 것이 Tavern 의 네임스페이스를 가진다는 것을 선언하는 것입니다.

Hello, World! 메세지.

 <?php

네임스페이스 선술집;

함수 Hello() {
    _e( '안녕하세요, 세계!', '예시-텍스트 도메인' );
}

접두사에 대한 이전 규칙을 따른다면 hello()tavern_hello() 로 이름이 지정되었을 것입니다. 그러나 네임스페이스의 경우에는 그렇지 않습니다. hello() 함수는 Tavern 네임스페이스 내에 캡슐화되어 있으며 hello() 라는 다른 함수와 충돌하지 않습니다.

클래스와 인터페이스는 함수와 동일하게 작동합니다. 클래스 이름이 Article 인 클래스 파일은 다음과 같을 수 있습니다.

 <?php

네임스페이스 선술집;

클래스 기사 {
    // ...
}

참고: 파일당 클래스 또는 인터페이스는 하나만 있어야 합니다. 이것은 자동 로더를 사용할 계획이라면 특히 중요합니다.

네임스페이스 이름 지정 방법

개발자는 이름을 지정하는 방법에 대해 논쟁하기를 좋아하며 만능 솔루션은 없습니다. 가장 중요한 규칙은 다른 프로젝트의 코드와 충돌하지 않도록 고유해야 한다는 것입니다. 이를 수행하는 가장 좋은 방법 중 하나는 Package 하위 네임스페이스와 함께 최상위 Vendor 네임스페이스를 사용하는 것입니다.

공급업체 네임스페이스가 Tavern 이고 문제의 프로젝트가 News 라는 WordPress 테마라고 가정합니다. 프로젝트의 네임스페이스는 다음과 같습니다.

 <?php

네임스페이스 Tavern\News;

일부 개발자에게는 다소 장황할 수 있습니다. 프로젝트 이름이 "Awesomesauce"와 같이 이미 상당히 고유한 경우 다음을 사용하기만 하면 됩니다.

 <?php

네임스페이스 Awesomesauce;

최소한 자신을 위한 일종의 표준 규칙을 만들고 싶을 것입니다. 결국 자동 로딩과 같은 기능을 사용하고 싶을 것이므로 모든 프로젝트에서 따르는 시스템이 도움이 될 것입니다. PHP-FIG Autoloader 표준을 자유롭게 정독하십시오.

클래스 및 함수를 다른 네임스페이스로 가져오기

현재 네임스페이스와 다른 네임스페이스의 클래스나 함수를 사용해야 하는 경우 가져와야 합니다. 이것은 PHP에서 use 키워드를 통해 수행됩니다.

use 문은 namespace 선언 뒤에 와야 합니다. 또한 정규화된 클래스 이름을 참조해야 합니다. 다음 코드는 Tavern\Helpers\Post 클래스를 다른 네임스페이스가 있는 파일로 가져옵니다.

 <?php

네임스페이스 선술집\템플릿;

Tavern\Helpers\Post를 사용하십시오.

가져온 후에는 다음 스니펫에 표시된 대로 Post 클래스를 직접 사용하는 것이 안전합니다.

 $post = 새로운 Post();

PHP 5.6부터는 use functionuse const 키워드를 사용하여 다른 네임스페이스에서 함수와 상수를 가져올 수도 있습니다. 다음 코드 블록은 함수와 상수를 모두 가져오는 방법을 보여줍니다.

 <?php

네임스페이스 선술집\템플릿;

기능 Tavern\Helpers\func_name 사용;
const Tavern\Helpers\CONSTANT_NAME 사용;

클래스 및 함수 앨리어싱

결국 현재 네임스페이스 내의 클래스나 함수와 이름이 같은 클래스나 함수를 가져와야 하는 상황에 봉착하게 됩니다. 이것이 네임스페이스가 해결해야 하는 문제라고 생각할 수도 있습니다. 다행히 PHP는 가져올 때 별칭을 만드는 방법을 제공합니다.

Tavern\User 라는 클래스가 있고 Tavern\Contracts\User 인터페이스를 구현해야 한다고 가정합니다. 인터페이스를 가져올 때 아래와 같이 별칭을 생성해야 합니다.

 <?php

네임스페이스 선술집;

Tavern\Contracts\User를 UserContract로 사용합니다.

클래스 사용자 구현 UserContract {
    // ...
}

use 문의 끝에 추가된 as UserContractUser 인터페이스에 대한 별칭을 만듭니다. 새 UserContract 이름을 오류 없이 안전하게 사용할 수 있습니다.

클래스, 인터페이스, 함수 및 상수는 모두 별칭을 만드는 동일한 방법을 따릅니다.

네임스페이스를 기반으로 폴더 구조 구성

네임스페이스와 프로젝트의 파일 및 폴더 구조가 일치하는 것은 더 넓은 PHP 세계의 표준 관행입니다. 이렇게 하면 다른 개발자가 프로젝트 내에서 코드를 쉽게 찾을 수 있습니다. 또한 요청 시 클래스를 로드하기 위한 자동 로더를 쉽게 구축할 수 있습니다.

일반적으로 모든 PHP 코드는 프로젝트의 /src , /inc 또는 유사한 이름의 폴더로 이동해야 합니다. 플러그인 파일 및 폴더 구조의 예는 다음과 같습니다.

 /플러그인 이름
    /src
        /핵심
            /활성화.php
            /설정.php
        /보다
            /포스트.php
            /페이지.php

네임스페이스가 있는 동일한 구조를 따르는 경우 위의 .php 파일에는 다음 클래스가 포함됩니다.

  • Tavern\Core\Activate
  • Tavern\Core\Setup
  • Tavern\View\Post
  • Tavern\View\Page

파일 및 폴더 이름은 대소문자를 구분하며 네임스페이스 및 클래스 이름과 정확히 일치해야 합니다.

물론, 당신은 당신이 원하는 어떤 규약이든 자유롭게 따를 수 있습니다. 그러나 앞의 권장 사항은 모범 사례이며 장기적으로 프로젝트를 구성하는 방법을 단순화합니다.

네임스페이스 사용의 이점

가장 확실한 이점은 동일한 이름을 가진 클래스와 함수 간의 충돌을 피하는 것입니다. 접두사를 사용한 것과 같은 이유로 실제 네임스페이스를 사용해야 합니다.

네임스페이스는 긴 클래스 이름을 피하는 데 도움이 됩니다. 대규모 프로젝트 전체에 긴 이름을 입력하는 것은 기껏해야 지루한 작업입니다.

가져오기를 통해 구현을 더 쉽게 전환할 수 있습니다. 다른 네임스페이스에서 클래스와 인터페이스를 가져오는 데 익숙해지면 한 줄의 코드로 인터페이스 구현을 전환할 수 있습니다.

최소한 최상위 네임스페이스가 필요한 PSR-4: Autoloader 표준을 따르면 클래스 자동 로드가 훨씬 쉽습니다.

전문 분야의 개발자의 경우 WordPress 생태계를 넘어 시장성 있는 기술을 얻을 수 있습니다. 네임스페이스 사용법을 모른다면 PHP 개발 작업을 찾기 어려울 것입니다. 이해하기 어려운 개념은 아니지만 실제로 일부 사람들에게는 학습 곡선이 있을 수 있습니다.