php5 autoload 활용하기

PHP/팁앱테크 2012. 4. 3. 13:39

PHP5 autoload 함수 활용하기


PHP5 부터는 __autoload 라는 특별한 함수를 지원한다.

기존의 클래스 파일을 사용하기 위해서는

include '/classes/db/DbMysqli.class.php';
$db =  new DbMysqli();

이와 같이 include 먼저 하고나서
클래스를 선언하여 사용해야 했다.
엄청 불편하다

자바처럼 그냥 new 로 생성해서 사용하면 편한데 말이다. ^^

그래서 나온것이 바로 요놈 __autoload 이다


이놈을 사용하게 되면
그냥 include 를 수동으로 코딩하지 않아도
__autoload 이놈이 알아서 include 해준다.
그러므로 이제부터는 그냥

$db = new  DbMysqli();

이렇게만 선언해서 사용하면 된다.

아래 소스는 __autoload 를 정의 해 놓은 것이다
소스는 이렇다

@ __autoload Source

# 절대 경로
define('_ROOT_PATH_', '/www/설치경로');

# 클래스 자동 인클루드
function __autoload($class_name)
{
        # 클래스명중 경로 추출
	$tmp_args = explode(' ', preg_replace( '/([a-z0-9])([A-Z])/', "$1 $2",$class_name));
	$class_path_name = sprintf("%s/{$class_name}",strtolower($tmp_args[0]));
	
	# 체크
         if(!class_exists($class_path_name,false))
	{
		# classes 폴더
		if(file_exists(_ROOT_PATH_.'/classes/'.$class_path_name.'.class.php') !==false){
			include_once _ROOT_PATH_.'/classes/'.$class_path_name.'.class.php';
		}

		# modules 폴더
		else if(file_exists(_ROOT_PATH_.'/modules/'.$class_path_name.'.class.php') !==false){
			include_once _ROOT_PATH_.'/modules/'.$class_path_name.'.class.php';
		}

		# 기타 만든 클래스 폴더 [첫대문자만 폴더로 지원]
		# ( /my/MyTest.class.php -> MyTest.class.php)
		else if(file_exists(_ROOT_PATH_.'/'.$class_path_name.'.class.php') !==false){
			include_once _ROOT_PATH_.'/'.$class_path_name.'.class.php';
		}
	}
}


자 이젠 __autoload 함수 정의 해 놓은 것을 설명할 차례군요

먼저, 아래와 같은 폴더 구조에 클래스 파일들이 있다고 가정을 합니다.

|----------------------------------------------------------------
|       파일경로 및 클래스 파일명         |         클래스명               
|-----------------------------------+----------------------------
/classes/db/DbMysqli.class.php         // class DbMysqli{ }
/classes/req/ReqForms.class.php       // class  ReqForms { } 
/classes/tpl/TplFusion.class.php         // class  TplFusion {}

/modules/bbs/BbsModel.class.php        // class BbsModel{ }
/modules/mem/MemModel.class.php      // class MemModel{ }

/my/MyTest.class.php                           // class MyTest{ }


1. __autoload($class_name) 는 new 라는 명령만 떨어지면 자동으로 호출이 됩니다.

$db = new DbMysqli();


new -> __autoload 를 호출하고
$class_name -> DbMysqli 클래스 명이 되는거죠

2. 클래스명에서 클래스가 위치 하고 있는 경로를 추출합니다. 기준은 첫번째 대문자로 시작하고
다음 대문자가 나오기 전까지의 클래스명의 문자는 폴더를 가리킵니다.

DbMysqli    이건 폴더 db 를 가리키고
ReqForms   이건 폴더 req 를 가리키고
BbsModel   이건 폴더 bbs 를 가리키고
MemModel  이건 폴더 Mem 를 가리키고
MyTest       이건 폴더 my 를 가리킵니다.

위와 같은 기준으로 위치 (폴더) 를 알아냅니다.

# 클래스명중 경로 추출
$tmp_args = explode(' ', preg_replace( '/([a-z0-9])([A-Z])/', "$1 $2",$class_name));
$class_path_name = sprintf("%s/{$class_name}",strtolower($tmp_args[0]));


2. 이미지 인클루드된 클래스 파일이 있는지 확인 한 후 있으면 include 안하고
없으면 하게 될겁니다.

제가 코딩 해 놓은건
일단 무조건 

1. classes 폴더 밑에 클래스 이름 폴더를 찾고 없으면
2. modules 폴더 밑에 클래스 이름 폴더를 찾고 그리고 나서
3. 선언된 클래스의 이름 폴더를 찾도록 하였습니다.

전 이유가 있어서 그랬지만  1,2번을 삭제하고 바로 3번만 선언해서 사용하셔도 됩니다.

그 역할을 하는 소스 부분이 바로 이 부분

# 체크
 if(!class_exists($class_path_name,false))
{
		# 1. classes 폴더
		if(file_exists(_ROOT_PATH_.'/classes/'.$class_path_name.'.class.php') !==false){
			include_once _ROOT_PATH_.'/classes/'.$class_path_name.'.class.php';
		}

		# 2. modules 폴더
		else if(file_exists(_ROOT_PATH_.'/modules/'.$class_path_name.'.class.php') !==false){
			include_once _ROOT_PATH_.'/modules/'.$class_path_name.'.class.php';
		}

		# 3. 기타 만든 클래스 폴더 [첫대문자만 폴더로 지원]
		# ( /my/MyTest.class.php -> MyTest.class.php)
		else if(file_exists(_ROOT_PATH_.'/'.$class_path_name.'.class.php') !==false){
			include_once _ROOT_PATH_.'/'.$class_path_name.'.class.php';
		}
}


끝까지 읽어 주셔서 감사합니다.
이 방법 말고도 php.net 에 보시면 클래스도 지원합니다.

마음에 드는 방법으로 사용하세요