사실 이글의 내용이 그누보드의 팁자료실에 적절한지를 주춤하였다. 그러나 그누보드도 언제인가는 이 방향으로 꼭 이 문제에 당착하게 될것이라 생각하구 여기에 글을 게시하게 되었다.
MVC구조의 PHP프레임워크들이 어떤 요청을 받으면 어느 클래스의 어느 메소드가 그 요청을 처리하여 리턴하는가 하는것을 제나름대로의 라우팅규칙을 제안한다.
여기서 꼭 살펴볼 문제가 있다.
실지로 어느 클래스라고 할때에는 그 클래스가 정의되어 있는 파일을 불러들이는것을 전제로 한다.
가령 index.php 파일에서 클래스 A, B, C 들을 사용해야 한다면
require_once('A.php');
require_once('B.php');
require_once('C.php');
$a = new A();
$B = new B();
$C = new C();
....
이렇게 해야 한다.
그런데 요청을 받아 처리할때 몇개의 클래스가 참여할지를 항시 생각하여 위와 같이 필요한 파일들을 로딩하는것은 개발하면 할수록 번거로운 문제로 된다.
이런 문제는 MVC개발구조를 기반으로 하는 CI, Laravel 등 프레임워크들에서도 명확히 해결해야 할 문제로 나선다.
바로 이 문제, 동적으로 파일을 로딩하는 기능을 spl_autoload_register() 함수가 지원해준다.
다음의 코드실례를 보자.
[code]
class Evening
{
public static function autoload($class)
{
$path = '/root/'.$class.'.php'; // 여기서 해당 클래스가 정의된 파일들의 경로를 작성해준다.
if (file_exists($path)) {
require_once $path;
return true;
}
return false;
}
}
spl_autoload_register(array('Evening','autoload'));
$a = new A(); // Evening::autoload('A') 로 자동 실행, /root/A.php 파일이 로드됨
$b = new B(); // Evening::autoload('B') 로 자동 실행, /root/B.php 파일이 로드됨
$c = new C(); // Evening::autoload('C') 로 자동 실행, /root/C.php 파일이 로드됨
[/code]
보는거처럼 require_once('/root/A.php') 와 같은 코드파일로딩부분이 없어도 spl_autoload_register()에 의하여 '/root/A.php' 파일을 불러들였다.
이와 같이 클래스실체를 창조하는 코드가 있을때 어느 파일을 불러들여야 하는가를 spl_autoload_register()에 의하여 규칙을 작성하여 지원가능해진다.
라라벨이든, CI든 MVC기반의 프레임워크들에는 spl_autoload_register()을 꼭 사용하여 자기고유의 파일로딩규칙을 작성해놓고 그를 기초로 모든 클래스파일들이 동적으로 로딩하고 있다.
결국 spl_autoload_register()에 의하여 매 프레임워크나 프로젝트가 자기의 고유한 특징을 발현하는것이다.
프레임워크야 어디에 무슨 파일을 어떻게 작성해놓는가만 알면 되지 구태야 이런것두 알아야 할까? 이 질문도 이해는 되지만 그래도 고수라면 spl_autoload_register()에 의해 규정되어있는 파일로딩특징을 잘 알아야 하는것이다.
전번에 게시한 나의 기사 [나만의 PHP프레임워크를 만들어 본다] 에 소개한 이브닝프레임워크도 spl_autoload_register()을 사용하여 제나름의 파일로딩규칙을 작성하였다.
프레임워크소스들에서 require, include 같은 코드구문은 몇개 안된다. 그것은 spl_autoload_register()를 이용하여 동적으로 파일을 불러들이는것을 규정하기만 하면 되기때문이다.
오늘의 이글을 보시는 분들이 프레임워크를 아득한 높이로만 여기는게 아니라 spl_autoload_register() 의 사용원리만 잘 아면 얼마든지 자기만의 고유한 개발구조를 창조할 수 있다는 자신감을 가지길 바란다.
그누보드도 MVC기반의 그누보드로 언제든 비약하는 모습을 그려보며 이글을 마친다.
댓글 4개
게시글 목록
| 번호 | 제목 |
|---|---|
| 17657 | |
| 17655 | |
| 17654 | |
| 17653 |
JavaScript
ThreeJS - 3D Bar and Progress Bar
1
|
| 17652 |
node.js
RAM점유크기에 의한 노드서버관리
|
| 17651 |
JavaScript
Javascript Undo, Redo 기능 구현하기
|
| 17650 | |
| 17642 |
node.js
nodejs서버가 사용중인 메모리에 대한 로그
|
| 17633 |
node.js
node.js에서 스케쥴링작성
8
|
| 17632 | |
| 17631 |
MySQL
InnoDB와 MyISAM의 우단점
|
| 17630 | |
| 17628 |
JavaScript
자바스크립트 기반으로 HTML Canvas에 이미지를 불러들여 테두리색입히기
|
| 17624 | |
| 17623 | |
| 17620 |
node.js
tcp소켓과 websocket 의 비교
2
|
| 17618 |
JavaScript
JavaScript로 이미지의 부분 영역을 따내기
|
| 17617 | |
| 17614 | |
| 17612 | |
| 17611 | |
| 17610 | |
| 17609 | |
| 17608 |
node.js
Node.js로 지속적인 핑 결과를 파일로 저장
|
| 17607 |
정규표현식
특수문자 제거, 우리글짜가 있는지 체크
|
| 17604 |
node.js
Node.js에서 PDF 파일의 페이지 수를 얻기
|
| 17603 | |
| 17602 |
node.js
Node.js로 워터마킹 기능을 구현하는 방법
|
| 17600 | |
| 17594 |
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기