DevTips – PHP의 네임스페이스

게시 됨: 2020-03-06

약 1년 전에 WordPress는 필요한 최소 PHP 버전을 5.2(2010년부터 사용)에서 최신 버전으로 업데이트하기로 결정했습니다. 사실, 오늘날 WordPress에서 권장하는 PHP의 최소 버전은 가장 최근 버전인 PHP 7.3입니다.

당신이 단순한 WordPress 사용자라면 이것은 아마도 당신에게 너무 많은 영향을 미치지 않을 것입니다(이 새 버전이 더 나은 성능을 제공한다는 사실 외에).

그러나 개발자라면 이 새로운 PHP 버전에는 플러그인과 테마에서 사용할 수 있는 몇 가지 멋진 기능이 있습니다. 그리고 오늘, 특히, 오랫동안 우리와 함께 해 온 이름 공간에 대해 이야기하고 싶습니다.

WordPress 및 코드 접두사

WordPress 개발자로서 배우는 첫 번째 규칙 중 하나는 "이름 충돌"을 피하기 위해 "우리가 하는 모든 일에 접두사를 사용"하는 것입니다. WordPress 모범 사례에서 읽을 수 있듯이:

플러그인이 변수, 함수 또는 클래스에 대해 다른 플러그인과 동일한 이름을 사용할 때 이름 충돌이 발생합니다.

[이름 충돌을 피하기 위해] 모든 변수, 함수 및 클래스는 고유 식별자를 접두사로 사용해야 합니다. 접두사는 다른 플러그인이 변수를 덮어쓰거나 실수로 함수와 클래스를 호출하는 것을 방지합니다. 그것은 또한 당신이 같은 일을 하는 것을 방지할 것입니다.

WordPress 플러그인 개발 모범 사례

따라서 예를 들어 get_site_id 와 같은 함수를 만드는 대신 nelio_content_get_site_id 로 이름을 지정하는 것이 좋습니다. 이렇게 하면 특정 기능( get_site_id )이 속한 플러그인( nelio_content ) 또는 테마를 빠르게 식별할 수 있고 여러 플러그인이 동일한 기능을 정의하려고 할 때 치명적인 오류를 피할 수 있습니다.

접두사를 사용하는 것은 "네임스페이스"를 만드는 기본적인 방법입니다. 더 나은 대안이 없을 때 구현해야 하는 해결 방법입니다. 동일한 접두사를 사용하는 모든 요소는 동일한 세트 또는 네임스페이스의 일부입니다. 그러나 이것은 불필요하게 더 복잡한 코드를 초래합니다.

PHP 네임스페이스

PHP 버전 5.3은 네임스페이스 의 개념을 도입했습니다. 그들이 문서에서 제공하는 정의가 나에게는 훌륭해 보였으므로 여기에 재현합니다.

가장 광범위한 정의에서 네임스페이스는 항목을 캡슐화하는 방법입니다. 이것은 많은 곳에서 추상적 개념으로 볼 수 있습니다. 예를 들어, 모든 운영 체제에서 디렉토리는 관련 파일을 그룹화하고 그 안에 있는 파일에 대한 네임스페이스 역할을 합니다. 구체적인 예를 들어, foo.txt 파일은 /home/greg 디렉토리와 /home/other 디렉토리 모두에 존재할 수 있지만 foo.txt 의 두 복사본은 동일한 디렉토리에 공존할 수 없습니다.

PHP 세계에서 네임스페이스는 클래스나 함수와 같은 재사용 가능한 코드 요소를 생성할 때 라이브러리 및 애플리케이션 작성자가 직면하는 두 가지 문제를 해결하도록 설계되었습니다.

1. 생성한 코드와 내부 PHP 코드 또는 타사 코드 간의 이름 충돌.

2. Extra_Long_Names 의 별칭(또는 단축) 기능으로 소스 코드의 가독성을 향상시킵니다.

PHP 문서

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

PHP에서 네임스페이스를 만드는 것은 매우 쉽습니다. 생성한 PHP 파일의 시작 부분에 사용하려는 이름의 namespace 지시문을 추가하고 해당 파일에서 정의한 "모든 것"은 해당 네임스페이스에 속하게 됩니다.

 <?php namespace Nelio_Content;

네, 간단합니다! 이제 우리가 생성하는 "모든 것"이 Nelio_Content 네임스페이스에 있습니다. 예를 들어, 내가 처음에 언급한 것과 같은 함수를 정의한다면:

 <?php namespace Nelio_Content; function get_site_id() { // ... }

이제 get_site_idNelio_Content 네임스페이스 안에 있다는 것을 압니다. 이런 식으로 함수를 정의할 때 더 이상 nelio_content_ 접두사를 사용할 필요가 없습니다. 엄청난!

네임스페이스에 대한 예외

내가 지금까지 말한 내용을 자세히 살펴보면 "모든 것"을 따옴표로 묶어서 작성했음을 알 수 있습니다. "여기에 추가하는 '모든 것'은 지정된 네임스페이스에 속할 것입니다." 내가 왜 그랬어? 네임스페이스는 우리가 작성하는 모든 코드에 절대적으로 적용되지 않기 때문에… 몇 가지 예외가 있습니다.

PHP 네임스페이스는 다음 PHP 요소만 다룹니다.

  • 클래스
  • 인터페이스
  • 특성
  • 기능
  • const 로 선언되었지만 define 으로 선언하지 않은 상수

또한 WordPress에는 고유한 네임스페이스가 필요한 몇 가지 추가 항목이 있습니다. 불행히도 PHP 네임스페이스는 스크립트 핸들 , 데이터베이스 옵션 또는 사용자 정의 콘텐츠 유형과 해당 메타데이터 등을 다루지 않습니다. 이러한 모든 경우에 다음을 수행해야 합니다. 접두사를 계속 사용하십시오.

한 네임스페이스에서 다른 네임스페이스로 요소를 가져오는 방법

고유한 네임스페이스에 있는 요소를 사용해야 하는 경우 특별한 작업을 수행할 필요가 없습니다. 이름으로 호출하기만 하면 됩니다. 예를 들어 다음 코드 스니펫에서:

 <?php namespace Nelio_Content; function get_site_id() { // ... } function get_auth_token() { $site_id = get_site_id(); // ... }

Nelio_Content 네임스페이스 내에서 get_site_idget_auth_token 이라는 두 가지 함수를 정의한 것을 볼 수 있습니다. get_auth_tokenget_site_id 를 사용해야 할 때 평소와 같이 단순히 호출합니다.

반면에 다른 네임스페이스에서 get_site_id 를 사용해야 하는 경우 전체 식별자를 사용하여 함수를 호출해야 합니다.

 <?php namespace Something_Else; function do_some_action() { $site_id = Nelio_Content\get_site_id(); // ... }

또는 use 키워드를 사용하여 함수를 가져와야 합니다.

 <?php namespace Something_Else; use Nelio_Content\get_site_id; function do_some_action() { $site_id = get_site_id(); // ... }

저는 개인적으로 두 번째 옵션을 매우 좋아합니다. 키워드 use 를 사용하여 다른 네임스페이스에서 함수를 가져오면 파일의 헤더를 빠르게 살펴보고 종속성을 식별할 수 있습니다.

PHP 네임스페이스를 사용한 WordPress 필터 및 작업

WordPress 필터 및 작업 옆에 네임스페이스를 사용할 때 염두에 두어야 할 중요한 세부 사항이 있습니다. 필터 및 작업 콜백을 지정할 때 일반적으로 콜백 이름을 문자열로 지정하여 지정합니다.

 <?php // ... add_action( 'init', 'do_some_action' );

문제는 이 함수가 네임스페이스 내에 있는 경우 이전 후크가 예상대로 작동하지 않는다는 것입니다. WordPress에 함수의 전체 이름을 알려야 합니다. 즉, 네임스페이스를 포함해야 합니다(있는 경우).

네임스페이스 자체를 정의하는 파일에 후크를 추가하고 있습니까? 중요하지 않습니다. 전체 이름을 사용하세요.

 <?php namespace Nelio_Content; function do_some_action() { // ... } add_action( 'init', 'Nelio_Content\do_some_action' );

다른 이름 공간에 있지만 use 하여 함수를 가져왔습니까? 그것도 중요하지 않습니다. 전체 이름을 사용하세요.

 <?php namespace Something_Else; use Nelio_Content\do_some_action; // ... add_action( 'init', 'Nelio_Content\do_some_action' );

네임스페이스에 별칭 사용

네임스페이스의 또 다른 매우 흥미로운 기능은 앨리어싱입니다. 다음 시나리오를 상상해 보십시오.

 <?php namespace Nelio_Content; function get_site_id() { // ... }

다른 네임스페이스에서 이 함수를 사용하고 싶다면 이미 use 로 할 수 있다는 것을 확인했습니다. 그러나 내가 사용하려는 모듈에 이미 get_site_id 라는 함수가 있는 경우 이 함수를 어떻게 사용합니까?

글쎄요, 운 좋게도 가져오기를 새 이름으로 별칭할 수 있습니다.

 <?php namespace Something_Else; use Nelio_Content\get_site_id as get_nc_site_id(); function get_site_id() { // ... } function do_some_action() { $nc_site_idd = get_nc_site_id(); // ... }

지금 네임스페이스 사용을 시작하십시오!

네임스페이스는 이름 충돌을 피하고 코드를 구성하는 환상적인 도구입니다. 사실, 이 게시물에 대해 언급하지 않았지만 PSR-4와 같은 표준이 있어 PHP가 사용하는 네임스페이스의 구조와 코드를 디렉토리와 파일로 구성하는 방법을 기반으로 클래스를 자동 로드할 수 있습니다.

아직 프로젝트에서 네임스페이스를 사용하고 있지 않다면 지금부터 시작하는 것이 좋습니다. 의견에 귀하의 경험에 대해 알려주십시오!

Unsplash에서 Chaitanya Tvs의 추천 이미지.