WordPress의 PHP 네임스페이스 – 말도 안 되는 가이드
게시 됨: 2018-10-16PHP 네임스페이스는 거의 10년이 되었습니다. 예, 10년이 지났습니다(예, 당신은 늙어가고 있습니다). PHP v5.3이 출시된 후 10년이 지났음에도 불구하고 많은 개발자들은 여전히 네임스페이스에 대한 기본적인 이해를 갖고 있지 않습니다. 사실 WordPress는 네임스페이스를 사용하지 않으므로 " WordPress로만 작업하는 경우 네임스페이스 사용 방법을 알 필요가 없습니다 ." 네임스페이스 닌자가 될 필요는 없지만 기본 사항을 이해하는 것은 간단하고 도움이 됩니다.
PHP 네임스페이스는 10년 동안 사용되어 왔으며 #wordpress도 사용하지 않기 때문에 여전히 사용하지 않습니까? 2분 안에 읽고 사용하세요! #개발
트윗하려면 클릭네임스페이스 지원이 없을 때 – 접두사 사용
오랫동안 PHP는 네이티브 네임스페이스를 지원하지 않았습니다. 이것이 워드프레스와 다른 많은 대형 코드베이스가 네이티브 네임스페이스를 사용하지 않는 이유입니다. 필요할 때 주변에 없었으므로 접두사가 사용되었습니다.
네임스페이스는 write_to_log()
함수가 다른 코드에 의해 이미 정의되지 않았는지 확인하기 때문에 중요합니다. 전역 범위에서 이름이 충돌하지 않도록 하려면 접두사가 필요하므로 함수는 awesome_project_write_to_log()
가 되고 다른 모든 함수와 변수도 awesome_project_
접두사를 갖게 됩니다. 단순한? 그것은이다! 예쁜? 정확히.
정적 메서드 캡슐화와 같은 접근 방식에 대한 몇 가지 대안이 있습니다. 모든 함수를 클래스로 래핑하고 정적 메서드로 선언합니다. 그런 다음 my_function()
을 호출하는 대신 My_Class::my_function()
) 을 호출합니다. 더 나은? 약간이지만 여전히 적절한 네임스페이스가 아닙니다.
네임스페이스를 통해 여러 코드 조각(또는 원하는 경우 패키지)이 충돌 없이 동일한 클래스 및 함수 이름을 사용하도록 허용하는 방법을 살펴보겠습니다. 또는 PHP 매뉴얼에서 말했듯이 – 코드 캡슐화를 활성화하는 방법. 파일 및 폴더에 대한 비유도 정확합니다. 여러 면에서 네임스페이스가 폴더처럼 작동하므로 설명서에서 복사/붙여넣기를 하겠습니다.
모든 운영 체제에서 디렉토리는 관련 파일을 그룹화하고 그 안에 있는 파일에 대한 네임스페이스 역할을 합니다. 예를 들어 foo.txt 파일은 /home/greg 디렉토리와 /home/other 디렉토리 모두에 존재할 수 있지만 foo.txt의 두 복사본은 같은 디렉토리에 공존할 수 없습니다. /home/greg 디렉토리 외부의 foo.txt 파일에 액세스하려면 디렉토리 구분자를 사용하여 파일 이름 앞에 전체 디렉토리 이름을 추가하여 /home/greg/foo.txt를 가져와야 합니다.
네임스페이스 선언 – 첫 번째 줄 기억
키워드 namespace
는 파일의 첫 번째 코드 라인이어야 합니다(주석 및 PHP가 아닌 콘텐츠 제외). 네임스페이스는 클래스, 인터페이스, 함수 및 상수에만 영향을 줍니다. 변수에 영향을 주지 않습니다. 여러 파일에 동일한 네임스페이스를 정의하여 코드를 여러 파일로 분할할 수 있습니다. 하위 네임스페이스를 사용하면 백슬래시( namespace myproject\level1\level2
)를 사용하여 폴더와 마찬가지로 네임스페이스의 계층 구조를 정의할 수 있습니다. 이것들은 네임스페이스 선언을 위한 기본적이고 거의 모든 규칙입니다.
// file-A.php contains a function under the myCompany\PackageA namespace namespace myCompany\PackageA; function do_something() { // do things }
// file-B.php contains a function with the same name // but under a different namespace namespace myCompany\PackageB; function do_something() { // do things }
가능하더라도 여러 네임스페이스를 단일 파일로 결합하지 않는 것이 좋습니다. 저를 믿으세요. 조만간 자신이 한 일을 잊어버리고 2분짜리 버그를 디버깅하는 데 2시간이 걸립니다. 그러나 필요한 경우 다음 구문이 있습니다.
// do not put multiple namespace declarations into the same file // but if you must, here's the syntax namespace MyFirstProject { const CONST = true; class Connection { /* ... */ } function connect() { /* ... */ } } namespace MySecondProject { const CONST = true; class Connection { /* ... */ } function connect() { /* ... */ } } // any code after this has to go in the global namespace namespace { $some_var = 1; function_in_global_namespace(); }
네임스페이스 사용 - 폴더 기억
이미 말했듯이 네임스페이스는 폴더와 매우 유사합니다. foo.txt
파일이 현재 폴더에 있다고 가정합니다. 간단한 foo.txt
로 참조할 수 있습니다. foo.txt
파일이 있는 폴더보다 한 단계 위인 경우 상대 경로 ../foo.txt
또는 절대 경로 /folder1/folder2/foo.txt
를 사용해야 합니다. 멋진 것은 없습니다. 네임스페이스는 동일한 패러다임을 사용합니다.

// remember after declaring a namespace // all our code is in it; like when you're working in a folder namespace mycompany\project; function foo() {} class foo { static function staticmethod() {} } // resolves to mycompany\project\foo() because of line #3 foo(); // likewise, resolves to mycompany\project\foo::staticmethod() foo::staticmethod(); // constant are affected by namespaces too // so we're working with mycompany\project\FOO echo FOO; // this is a relative path // resolves to mycompany\project\subnamespace\foo() subnamespace\foo(); // static methods are no different // mycompany\project\subnamespace\foo::staticmethod() subnamespace\foo::staticmethod(); // a full namespace path starts with a backslash // it resolves exactly to what it says it does \otherNamespace\Bar\foo(); // again same thing for a constant, full path nothing magical echo \otherNamespace\Bar\FOO;
PHP 매뉴얼에서 use
키워드를 살펴보십시오. 예제는 훌륭합니다. 다른 PHP 네임스페이스에서 현재 네임스페이스로 코드를 가져오거나 별칭을 사용하여 외부(정규화된) 이름을 참조하는 방법을 제공합니다.
예, 네임스페이스가 필요하고 사용해야 합니다.
WordPress의 소스를 보면 더 분명해지기 때문에 네임스페이스를 사용할 필요는 없지만 몇 가지 네임스페이스 방법을 사용해야 합니다. WP의 경우 wp_
접두사. 우리가 이미 하고 있다면 제대로 하지 않는 이유는 무엇입니까?
PHP의 네임스페이스는 모든 개발 워크플로에 쉽게 통합됩니다. 자동 로드, 파일 이름 지정을 용이하게 하고 일반적으로 코드를 더 깔끔하게 만듭니다. 오래된 코드를 리팩토링하는 것은 결코 인기 있는 작업이 아닙니다(코딩 언어에 관계없이). 그래서 나는 당신에게 네임스페이스를 사용한다고 말할 수 있도록 작업 중인 2MB 프로젝트를 리팩토링하라고 말하지 않을 것입니다. 그러나 나는 새 프로젝트에서 작업할 때 네임스페이스를 사용하라고 주장할 것입니다. 곧 감사할 것입니다.
네임스페이스에 대한 공식 PHP 문서는 그 이상입니다! 코드 샘플은 깨끗하고 주석은 실제 세계에 도움이 됩니다. 필요하지 않다고 생각하더라도 찾아보십시오.