프로그램은 작고 단순한 것에서 크고 복잡한 것으로 진화한다. 그 과정에서 코드의 재활용성을 높이고, 유지보수를 쉽게 할 수 있는 다양한 기법들이 사용된다. 그 중의 하나가 코드를 여러개의 파일로 분리하는 것이다. 이를 통해서 얻을 수 있는 효과는 아래와 같다.
자주 사용되는 코드를 별도의 파일로 만들어서 필요할 때마다 재활용할 수 있다.
코드를 개선하면 이를 사용하고 있는 모든 애플리케이션의 동작이 개선된다.
코드 수정 시에 필요한 로직을 빠르게 찾을 수 있다.
필요한 로직만을 로드해서 메모리의 낭비를 줄일 수 있다.
include란?
PHP에서는 필요에 따라서 다른 PHP 파일을 코드 안으로 불러와서 사용할 수 있다. 그 방법에 대해서 알아보자.
include는 외부의 php 파일을 로드할 때 사용하는 명령이다.
PHP는 외부의 php 파일을 로드하는 방법으로 4가지 형식을 제공한다. 형식의 종류는 아래와 같다.
include
include_once
require
require_once
include와 require의 차이점은 존재하지 않는 파일의 로드를 시도했을 때 include가 warning를 일으킨다면 require는 fatal error를 일으킨다는 점이다. fatal error는 warning 보다 심각한 에러이기 때문에 require가 include 보다 엄격한 로드 방법이라고 할 수 있다.
_once라는 접미사가 붙은 것은 파일을 로드 할 때 단 한번만 로드하면 된다는 의미다. 문서에 이미 로드된 동일 문서가 있다면 - include_once()는 더이상 include하지 않는다는 차이점이 있다
namespace
함수, 상수, 클래스와 같은 것들의 이름. 서로 같은 이름을 가지고 있는 것들이 충돌하는 것을 방지하기 위한 수단.
파일은 데이터를 보관하고 있는 일종의 컨테이너다. 그리고 이 컨테이너는 파일명으로 식별이 된다. 파일의 수가 많아지면서 파일을 관리하는 것이 점점 어려워진다. 그래서 고안된 것이 바로 디렉토리다. 디렉토리를 이용하면 같은 이름의 파일이 하나의 컴퓨터에 존재할 수 있다. 파일명의 충돌을 회피 할 수 있게 된 것이다. 네임스페이스란 간단하게 디렉토리와 같은 것이라고 생각하자. 하나의 에플리케이션에는 다양한 모듈을 사용하게 된다. 그런데 모듈이 서로 다른 개발자에 의해서 만들어지기 때문에 같은 이름을 쓰는 경우가 생길 수 있다. 이런 경우 먼저 로드된 모듈은 나중에 로드된 모듈에 의해서 덮어쓰기 되기 때문에 이에 대한 대책이 필요하다. 네임스페이스가 필요해지게 되는 것이다.
greeting_en.php
<?php
function welcome(){
return 'Hello world';
}
?>
greeting_ko.php
<?php
function welcome(){
return '안녕세계';
}
?>
다른 파일이지만 같은 이름의 함수를 정의하고 있다.
<?php
require_once 'greeting_ko.php';
require_once 'greeting_en.php';
echo welcome();
echo welcome();
?>
함수 호출시 php에서는 함수의 중복 선언을 허용하지 않기 때문에 오류가 발생한다.이런 경우 네임스페이스를 사용할 수 있다.
<?php
namespace language\en;
function welcome(){
return 'Hello world';
}
<?php
namespace language\ko;
function welcome(){
return '안녕하세요';
}
<?php
require_once 'greeting_ko_ns.php';
require_once 'greeting_en_ns.php';
echo language\ko\welcome();
echo language\en\welcome();
?>
로드되는 파일의 초입에 키워드 namespace를 이용해서 네임스페이스를 만들었다. 그리고 네임스페이스를 사용할 때는 함수 앞에 네임스페이스의 이름을 붙여서 사용하면 된다. 이로서 동일한 이름의 함수를 하나의 php 에플리케이션 안에서 사용할 수 있게 되었다.
하나의 파일에는 복수의 네임스페이스가 존재 할 수도 있다.
<?php
namespace language\en;
function welcome(){
return 'Hello world';
}
namespace language\ko;
function welcome(){
return '안녕세계';
}
<?php
require_once 'greeting_lang.php';
echo language\ko\welcome();
echo language\en\welcome();
?>