프로그램은 작고 단순한 것에서 크고 복잡한 것으로 진화한다. 그 과정에서 코드의 재활용성을 높이고, 유지보수를 쉽게 할 수 있는 다양한 기법들이 사용된다. 그 중의 하나가 코드를 여러개의 파일로 분리하는 것이다. 이를 통해서 얻을 수 있는 효과는 아래와 같다.
- 자주 사용되는 코드를 별도의 파일로 만들어서 필요할 때마다 재활용할 수 있다.
- 코드를 개선하면 이를 사용하고 있는 모든 애플리케이션의 동작이 개선된다.
- 코드 수정 시에 필요한 로직을 빠르게 찾을 수 있다.
- 필요한 로직만을 로드해서 메모리의 낭비를 줄일 수 있다.
include란?
PHP에서는 필요에 따라서 다른 PHP 파일을 코드 안으로 불러와서 사용할 수 있다. 그 방법에 대해서 알아보자.
include가 없다면
우선 include가 없는 애플리케이션을 하나 만들어보자. 이 코드의 파일명은 1.php 다.
<?php function welcome(){ return 'Hello world'; } echo welcome(); ?>
위의 코드는 아무런 문제가 없다. 하지만 welcome 함수가 자주 사용되는 것이라고 가정해보자. 이런 경우 이것이 필요할 때마다 이 함수를 정의해서 사용하는 것은 유지보수도 어렵고 낭비가 될 것이다. 이럴 때 include가 필요하다. 함수 welcome을 include해보자.
include의 사용
새로운 파일을 만든다. 이름은 greeting.php다.
greeting.php
<?php function welcome(){ return 'Hello world'; } ?>
새로운 파일을 만들고 아래와 같이 greeting.php를 인클루드한다.
2.php
<?php include 'greeting.php'; echo welcome(); ?>
이전 예제와 비교했을 때 결과는 같다. 하지만 함수 welcome을 외부 파일로 분리했다. 다음은 위의 코드에 대한 분석이다.
include 'greeting.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라는 접미사가 붙은 것은 파일을 로드 할 때 단 한번만 로드하면 된다는 의미다.
네임스페이스
네임스페이스가 무엇인가를 정의하기에 앞서서 파일을 생각해보자. 파일은 데이터를 보관하고 있는 일종의 컨테이너다. 그리고 이 컨테이너는 파일명으로 식별이 된다. 파일의 수가 많아지면서 파일을 관리하는 것이 점점 어려워진다. 그래서 고안된 것이 바로 디렉토리다. 디렉토리를 이용하면 같은 이름의 파일이 하나의 컴퓨터에 존재할 수 있다. 파일명의 충돌을 회피 할 수 있게 된 것이다. 네임스페이스란 간단하게 디렉토리와 같은 것이라고 생각하자. 하나의 에플리케이션에는 다양한 모듈을 사용하게 된다. 그런데 모듈이 서로 다른 개발자에 의해서 만들어지기 때문에 같은 이름을 쓰는 경우가 생길 수 있다. 이런 경우 먼저 로드된 모듈은 나중에 로드된 모듈에 의해서 덮어쓰기 되기 때문에 이에 대한 대책이 필요하다. 네임스페이스가 필요해지게 되는 것이다.
만약 환영인사를 언어별로 다르게 하고 싶다면 어떻게 해야 할까? 3개의 파일을 만든다.
greeting_en.php
<?php function welcome(){ return 'Hello world'; }
greeting_ko.php
<?php function welcome(){ return '안녕세계'; }
5.php
<?php require_once 'greeting_ko.php'; require_once 'greeting_en.php'; echo welcome(); echo welcome(); ?>
위의 코드는 아래와 같은 에러를 발생시킨다.
Fatal error: Cannot redeclare welcome() (previously declared in D:\BitNami\wampstack-5.4.12-0\apache2\htdocs\include\greeting_ko.php:3) in D:\BitNami\wampstack-5.4.12-0\apache2\htdocs\include\greeting_en.php on line 4
로드한 두개의 파일 모두 welcome라는 함수를 선언했기 때문이다. PHP에서는 함수의 중복 선언을 허용하지 않는다. 이런 경우 네임스페이스를 사용할 수 있다. 아래와 같이 로드되는 파일의 내용을 수정해보자.
greeting_en_ns.php
<?php namespace language\en; function welcome(){ return 'Hello world'; }
greeting_ko_ns.php
<?php namespace language\ko; function welcome(){ return '안녕하세요'; }
6.php
<?php require_once 'greeting_ko_ns.php'; require_once 'greeting_en_ns.php'; echo language\ko\welcome(); echo language\en\welcome(); ?>
로드되는 파일의 초입에 키워드 namespace를 이용해서 네임스페이스를 만들었다. 그리고 네임스페이스를 사용할 때는 함수 앞에 네임스페이스의 이름을 붙여서 사용하면 된다. 이로서 동일한 이름의 함수를 하나의 php 에플리케이션 안에서 사용할 수 있게 되었다.
하나의 파일에는 복수의 네임스페이스가 존재 할 수도 있다.
greeting_lang.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(); ?>
네임스페이스는 함수 뿐만 아니라 클래스와 상수에 대해서도 사용할 수 있다. 네임스페이스에 대한 자세한 내용은 아래의 자료들을 참고하자.