# include와 namespace
프로그래밍은 유지보수가 생명이다. 유지보수를 쉽게 하기위하여 변수 그리고 함수, 객체화 등을 하는 것인데, 본 장에서 다룰 include와 namescape 역시 유지보수의 효율을 제고하기 위하여 사용하는 기능들 중 하나인 것이다.
include란, PHP에서 필요에 따라 다른 PHP파일을 코드 안으로 불러와 사용할 수 있도록 하는 기능을 가지고 있다. 내용은 다음과 같다.
namespace는 가령 여러개의 PHP파일을 include를 통하여 불러왔을 때, 각기 다른 PHP파일에 같은 이름의 함수 혹은 클래스 이름으로 인하여 발생한 충돌을 해결할 수 있는 기능이다.
# Include , require , _once
# greeting.php
function greeting() {
return "Hello World!";
}
# USE.php
include 'greeting.php';
echo greeting();
상기 코드블럭처럼, 하나의 php파일에서 정의된 함수가 다른 php파일에서 또 사용되어야 하는 경우가 발생하였을 때, 이미 정의해놓은 함수를 include로서 불러오면, 똑같은 함수를 똑같이 정의하는 중복을 제거할 수 있게 된다.
이렇게 중복을 제거한다면, 프로그램의 효율이 올라가고, 이후 해당 함수를 정의할 때 훨씬 더 용이하게 된다. 이는 즉 프로그램의 유지 보수에 직결되는 문제가 되는 것이고, 이러한 기능을 잘 사용하여 프로그램을 설계/ 개발하는것이 중요하다는 것을 의미한다.
Include와 유사한 기능을 갖고 있는 require라는 키워드가 있다. include와 require 둘 다 외부의 php파일을 해당 파일로 불러오는 기능을 갖고 있는데, 둘의 차이는 로드 방법의 차이이다.
include로 php를 불러왔을떄, 불러온 파일이 존재하지 않거나, 해당 기능이 사라져 있다면 php는 warning(경고)을 발생시킨다. 하지만 require로 php를 불러왔을때, 같은 상황이라면 fatal error를 발생시킨다. 이것은 require가 include보다 더 엄격하게 php를 로드해온다는 것을 의미한다.
파일을 중복적으로 로드하거나, 한번만 로드해야하는데 실수로인한 중복로드가 발생한다면 의도한대로 프로그램이 동작하지 않게된다. 이런 것을 방지하기 위하여 include와 require 둘 다 _once라는 접미사를 지원하는데, 만일 _once접두사를 붙이고 include 혹은 require를 사용한다면, 한번 만 로드를 한 후 다시 로드하는 코드를 작성하여도 로드를 하지 않게 된다.
# namespace
상기와 같은 내용으로, 만일 include를 중복으로 실행했을때 같은 이름의 함수가 있다면 php 엔진은 오류를 일으키게 된다. 이것을 막기위해, 같은 폴더안에 있더라도 다른 디렉토리에 있는 것 처럼 치부할 수 있도록 도와 다른 파일처럼 인식하도록 하는 기능을 namespace라고 한다. 예제는 다음과 같다.
#greeting_en.php
function welcome(){
return "hello world!";
}
#greeting_ko.php
function welcome() {
return "안녕, 세계!"
}
require_once 'greeting_en.php';
require_once 'greeting_ko.php';
echo welcome();
echo welcome();
코드가 상기와 같은 상황이라면, echo welcome()은 fatal오류를 일으킬 것이다. 코드를 읽을때에도, 같은 이름의 함수를 불러온다면 어디에서 어떤 함수를 가져온건지 확인하기 어려운 상황이 발생하는 것이다.
이러한 현상은 협업을 하거나, 혹은 다수의 라이브러리를 이용하면 발생할 수 있는 상황인데, 이러한 상황을 해결하기 위하여 구비된 것이 namespace인 것이다. 하기와 같이 사용한다면 충돌을 억제할 수 있다.
#greeting_en_ns.php
namespace language\en;
function welcome() {
return "hello! world!";
}
#greeting_ko_ns.php
namescape language\ko;
function welcome() {
return "안녕! 세게!";
}
#test.php
require_once 'greeting_ko_ns.php'
require_once 'greeting_en_ns.php'
echo language\ko\welcome();
echo language\en\welcome();
상기와 같이 작성한다면, 어느 php파일에서 어떤 함수를 어떠한 의도로 불러왔는지가 읽을때에도 분명히 읽힐수 있다. 이러한 점을 의도하여 구비된 것이 namespace인 것이다.
namespace는 같은 폴더 안에 있더라도 각각의 php파일을 서로다른 디렉토리에 위치하여 고립된 것 처럼 취급하여 사용할 수 있도록 장치를 마련해줄 수 있는 기능이 있다.
'Language > PHP' 카테고리의 다른 글
공부 내용 정리 PHP :: 초급 III (0) | 2021.06.01 |
---|---|
공부 내용 정리 PHP :: 초급 II (0) | 2021.05.31 |
공부 내용 정리 PHP :: 기초 IV (0) | 2021.05.25 |
공부 내용 정리 PHP :: 기초 III (0) | 2021.05.25 |
공부 내용 정리 PHP :: 기초 II (0) | 2021.05.23 |